2011-01-19 44 views
44

我想知道是否有任何相對簡單的方法來加快我的控制檯加載時間,這將開始接近30秒。我有很多子類的方法似乎不受reload!的影響,所以我最終打開和關閉了很多控制檯。 IRB快速加載閃電。Rails 3 - 加快控制檯加載時間

我是否有太多的寶石?我如何才能計算加載任務,以便我能看到最多花費的時間?正如你所看到的,我已經嘗試了開發 - 增強寶石,但無濟於事。該應用在Passenger中很好,這只是控制檯加載,讓我感到厭倦。在2.4GHz和4GB RAM的MBP OSX 10.6.6上運行。不使用RVM。

版本:

Ovid$ rails -v 
Rails 3.0.3 
Ovid$ ruby -v 
ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-darwin10] 

內存:

Ovid$ vm_stat 
Mach Virtual Memory Statistics: (page size of 4096 bytes) 
Pages free:       118818. 
Pages active:      341320. 
Pages inactive:      99490. 
Pages speculative:     310576. 
Pages wired down:     112527. 
"Translation faults":    23097323. 
Pages copy-on-write:    1270961. 
Pages zero filled:    13836659. 
Pages reactivated:      36. 
Pageins:       165761. 
Pageouts:        0. 
Object cache: 28 hits of 760846 lookups (0% hit rate) 

的Gemfile:

source 'http://rubygems.org' 

gem 'rails', '3.0.3' 
gem 'mysql2' 
gem 'foreigner' 
gem 'haml' 
gem 'capistrano' 
gem 'nokogiri' 

#web services 
gem 'yammer4r' 
gem 'ruby-freshbooks' 

#authentication gems from nifty generator 
gem "bcrypt-ruby", :require => "bcrypt" 
gem "mocha", :group => :test 
gem 'authlogic' 

#dev 
group :development do 
    gem 'rails-dev-boost', :git => 'git://github.com/thedarkone/rails-dev-boost.git', :require => 'rails_development_boost' 
end 

#testing 
group :test do 
    gem 'database_cleaner' 
    gem 'cucumber-rails' 
    gem 'cucumber' 
    gem 'rspec-rails' 
    gem 'spork' 
    gem 'launchy' 
    gem 'machinist' 
    gem 'faker' 
    gem 'capybara' 
end 

非常感謝您!

+0

好問題!讓我們知道你發現什麼。 :) – 2011-01-19 18:30:32

+0

也發佈到http://www.ruby-forum.com/topic/914379 – pendevere 2011-01-20 15:52:44

回答

1

我只能建議穿上你的實驗服,並平分這個問題。看看註釋掉所有的寶石要求是否會加快速度(大概也會涉及到註釋那些依賴這些寶石的代碼段)。如果是這樣,請一次註釋掉一半,等等。

對不起,這不是一個真正的答案..你可以嘗試ruby-prof我想,例如通過調用它與rails runner和一個無操作腳本。

我想在我的Mac ruby-prof script/rails runner 'nil'但它似乎剛剛墜毀:-)

編輯

如果您使用的git爲您的應用程序,你可以嘗試它太平分命令,看看當事情變得緩慢時,有一個特定的時間點,而不是普遍的膨脹。

0

重新加載!一段時間以來一直是個問題。看看this。有一些你可以使用的補丁和一些關於如何解決問題的技巧。

重載方法本身看起來像這樣。

# reloads the environment 
def reload!(print=true) 
    puts "Reloading..." if print 
    ActionDispatch::Callbacks.new(lambda {}, false).call({}) 
    true 
end 

您可以隨時將環境添加到此方法以覆蓋它的功能並強制重新加載。

這對我有用,所以讓我們知道它是否適用於您。祝一切順利。

+0

謝謝你的建議 - 我試了你的補丁和其他更長的補丁在線程中。但我沒有運氣。你的意思是該行應該說ActionDispatch :: Callbacks.new(Proc.new {},false).call(RAILS_ENV),對不對? – pendevere 2011-01-20 07:58:54

58

我終於找到了使用Benchmark的啓動瓶頸。特別是,導航到捆綁寶石和LIB /捆紮機/ runtime.rb,發現確實Kernel.require行和其包裝像這樣:

puts Benchmark.measure("require #{file}") { 
    Kernel.require file 
}.format("%n: %t %r") 

您可能需要添加需要的「基準」在某處你的應用程序,就像在config/boot.rb中一樣。這將告訴你需要多長時間來需要每個寶石。我不能保證你的結果會與我的結果相匹配,但是我有幾個寶石,其中大部分寶寶都接管了一秒鐘以上,而大部分時間是亞毫秒。一些是我並不需要的寶石開發但我確實需要開發環境中的一些任務,例如, capistrano,應該。我對創業公司的其他領域(初始化者等)進行了基準測試,但找不到任何重大瓶頸。

我還沒有想出一個乾淨的方式來配置應用程序,只加載那些真正需要的任務。可能的話,我可以創建一個名爲speedy的環境,並且當我知道我不需要那些寶石時,可以使用RAILS_ENV = speedy rails s/c來啓動。然後在Gemfile中,我可以使用group:speedy在某些情況下排除這些寶石。

所有這一切說,對我來說最大的啓動煩惱是不得不加載整個環境來運行rake任務。我可能會排除大多數寶石,但Gemfile會開始變得混亂,所以我不知道它是否值得。

+7

這個黑客提供了一些非常有趣的數據。我想知道有多少寶石作者意識到他們的工作會導致開機時間過長。 – 2011-05-11 05:43:39

+1

請記住:要求'基準' 某處在該文件中 – makevoid 2012-06-19 00:07:09

7

您可以通過將:require => nil添加到緩慢的Gemfile條目並手動要求它們來加速它。 例如

gem 'jammit', :require => nil 

我也在一次見面會上討論過這個問題。 這似乎是紅寶石1.9.2中的錯誤(見本補丁的評論:https://gist.github.com/1008945

您可以通過打補丁修復你的1.9.2由我只是鏈接的要點或升級到1.9.2-head1.9.3-head

20

稍微適應形式,是複製pastable,包裝所有要求,並提供了排序輸出:

# Add this to the top of boot.rb 
require 'benchmark' 
def require(file) 
    puts Benchmark.measure("") { 
    super 
    }.format("%t require #{file}") 
end 

然後你就可以執行任何操作,看到他們:

rails runner 1 

或者對它們進行排序並顯示前50:

rails runner 1 | sort -nr | head -n 50 
1

這絕對是關於清理你的代碼和確定瓶頸,但是一旦你完成了這些節省,就值得看看宙斯這樣的東西來加速你的開發時間。

gem install zeus 

https://github.com/burke/zeus(文檔)

這不是沒有錯誤,並有時確實需要重新啓動,但我仍然看到通過快速服務器和控制檯的開發時間整體增加後,小代碼的變化重新啓動。