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

pen*_*ere 44 ruby console ruby-on-rails ruby-on-rails-3

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

我有太多宝石吗?我如何计算负载任务的时间,以便我可以看到占用时间最多的是什么?正如你所看到的,我已经尝试过dev-boost 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]
Run Code Online (Sandbox Code Playgroud)

记忆:

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)
Run Code Online (Sandbox Code Playgroud)

的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
Run Code Online (Sandbox Code Playgroud)

非常感谢你!

Bri*_*ing 59

我终于使用Benchmark找到了我的创业瓶颈.特别是,导航到bundler gem并在lib/bundler/runtime.rb中找到执行Kernel.require的行并将其包装如下:

puts Benchmark.measure("require #{file}") {
  Kernel.require file
}.format("%n: %t %r")
Run Code Online (Sandbox Code Playgroud)

您可能必须在应用程序的某处添加require'camprate',例如config/boot.rb.这将显示需要多长时间才能要求每个宝石.我不能保证你的结果会与我的结果相符,但是我有一些宝石需要花费一秒钟才能加载,相比之下,亚毫秒就是大多数宝石.一些是我不需要开发的宝石,但我确实需要开发环境中的一些任务,例如capistrano,shoulda.我对其他启动领域(初始化程序等)进行了基准测试,但未发现任何重大瓶颈.

我还没有想出一个干净的方法来配置应用程序只加载那些他们真正需要的任务.可能,我可以创建一个名为:speedy的环境,当我知道我不需要那些宝石时,使用RAILS_ENV = speedy rails s/c进行启动.然后在Gemfile中,我可以使用group:speedy在某些情况下排除那些宝石.

所有这一切,对我来说最大的启动烦恼是必须加载整个环境来运行rake任务.我可能会为此排除大多数宝石,但是Gemfile会开始变得混乱,所以我不知道它是否值得.

  • 这个hack提供了一些非常有趣的数据.我想知道有多少宝石作者意识到他们的工作对漫长的启动时间有多大贡献. (7认同)

jqr*_*jqr 21

稍微适应的形式,可复制,包装所有需求,并提供可排序的输出:

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

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

rails runner 1
Run Code Online (Sandbox Code Playgroud)

或者排序并显示前50名:

rails runner 1 | sort -nr | head -n 50
Run Code Online (Sandbox Code Playgroud)

  • for rails 2.3/ruby​​ 1.8.7使用`script/runner 1` (2认同)
  • 你救了我们2天:) (2认同)

Dan*_*tra 7

您可以通过向慢速Gemfile条目添加:require => nil来加速它并手动需要它们.例如

gem 'jammit', :require => nil
Run Code Online (Sandbox Code Playgroud)

我也在一次聚会中解决了这个问题.这似乎是ruby 1.9.2中的一个错误(请参阅此补丁的评论:https://gist.github.com/1008945)

您可以通过修补1.9.2我刚刚链接或升级到1.9.2-head或的修补程序来修复它1.9.3-head.

  • 听起来是一个好主意.我们看到像activeadmin和omniauth这样的宝石需要时间来加载,所以想知道在以后加载它们而不影响任何功能的最佳策略是什么.在完全装载导轨后,手动要求这些位置的最佳位置在哪里? (3认同)

noo*_*odl 1

我只能建议你穿上实验服,把问题一分为二。看看注释掉所有 gem 需求是否可以加快速度(大概这还涉及注释掉依赖于这些 gem 的代码片段)。如果是这样,一次注释掉一半,依此类推。

抱歉,这不是真正的答案。我想您可以尝试 ruby​​-prof,例如通过使用rails runner无操作脚本调用它。

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

编辑

如果你在你的应用程序中使用 git,你也可以尝试它的 bisect 命令,看看是否有一个特定的时间点,事情变得缓慢,而不仅仅是一般的膨胀。