Rails 3 – 加快控制台加载时间

我想知道是否有任何相对简单的方法来加快我的控制台加载时间,这是开始接近30秒。 我有很多子类的方法似乎没有受到reload!影响reload! 所以我最终打开和closures控制台很多。 IRB快速加载闪电。

我有太多的gem? 我怎么去计算负载任务,以便我能看到最多的时间是什么? 正如你所看到的,我已经尝试了开发 – 提升的gem,无济于事。 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 

非常感谢你!

我终于find了使用Benchmark的启动瓶颈。 特别是,导航到捆绑软件gem和lib / bundler / runtime.rb中,findKernel.require所在的行,并像这样包装它:

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

您可能需要在应用程序的某处添加require'benchmark',比如在config / boot.rb中。 这将告诉你多久需要每个gem。 我不能保证你的结果与我的结果相符,但是我有几个gem,一秒钟以上加载,大部分时间是亚毫秒。 一些是我不需要开发的gem,但我确实需要在开发环境中进行一些任务,例如capistrano,shoulda。 我对其他创业领域(初始化者等)进行了基准testing,但是找不到任何重大的瓶颈。

我还没有想出一个干净的方式来configuration应用程序只加载那些真正需要的任务。 可能的话,我可以创build一个名为“speedy”的环境,当我知道我不需要那些gem时,可以使用RAILS_ENV = speedy rails s / c来启动。 然后在Gemfile中,我可以使用group:speedy在某些情况下排除这些gem。

所有这一切,对我来说最大的启动烦恼是不得不加载整个环境来运行一个耙子任务。 我可能会排除大多数的gem,但Gemfile会开始变得凌乱,所以我不知道它是否值得。

稍微适应的forms是可复制的,包装所有要求,并提供可sorting的输出:

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

然后你可以执行no-op来查看它们:

 rails runner 1 

或sorting他们,并显示前50名:

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

您可以通过将:require => nil添加到缓慢的Gemfile条目并手动要求它们来加速它。 例如

 gem 'jammit', :require => nil 

我也在一个聚会上讨论过这个问题。 这似乎是一个ruby1.9.2中的错误(请参阅此修补程序的评论: https : //gist.github.com/1008945 )

你可以通过修补你的1.9.2来修复它,只要把它连接起来或升级到1.9.2-head或者1.9.3-head

我只能build议穿上你的实验服,把这件事分开。 看看是否注释掉所有的gem要求加速(可能还会涉及注释依赖于这些gem的代码段)。 如果是的话,一次性注释掉一半,等等。

对不起,这不是一个真正的答案..你可以尝试ruby-prof我想,例如通过调用rails runner和no-op脚本。

我试图在我的Mac上ruby-prof script/rails runner 'nil' ,但它似乎刚崩溃:-)

编辑

如果你使用git作为你的应用程序,那么你也可以试试它的对分命令,看看是否有一个特定的时间点,当事情变得缓慢,而不是普遍的膨胀。

这绝对是清理你的代码和识别瓶颈,但是一旦你节省了这些钱,就值得看看Zeus这样的东西来加速你的开发时间。

 gem install zeus 

https://github.com/burke/zeus(docs

这不是没有错误,有时需要重新启动,但我仍然看到小代码更改后快速服务器和控制台重新启动,总体上增加了开发时间。

刷新! 一段时间以来一直是个问题。 看看这个 。 有一些你可以使用的补丁和一些关于如何能够解决你的问题的提示。

重载方法本身看起来像这样。

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

你总是可以添加你的环境到这个方法来覆盖它的function,并强制重新加载你需要的。

这对我有效,所以让我们知道,如果它适合你。 祝一切顺利。