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

时间:2011-01-19 14:43:53

标签: ruby-on-rails ruby ruby-on-rails-3 console

我想知道是否有任何相对简单的方法来加快我的控制台加载时间,这开始接近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]

内存:

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

非常感谢!

7 个答案:

答案 0 :(得分:58)

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

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

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

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

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

答案 1 :(得分:20)

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

# 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

或者排序并显示前50名:

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

答案 2 :(得分:7)

您可以通过添加以下内容来加快速度:require =>没有慢速Gemfile条目并需要手动。 e.g。

gem 'jammit', :require => nil

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

您可以通过修改我刚刚关联或升级到1.9.21.9.2-head的要点修改1.9.3-head来修复此问题。

答案 3 :(得分:1)

我只能建议穿上你的实验室外套并将问题一分为二。看看评论你所有的宝石需求是否加快了速度(可能还会涉及评论依赖这些宝石的代码片段)。如果是这样,一次评论一半,等等。

对不起,这不是一个真正的答案..你可以尝试使用ruby-prof,例如通过使用rails runner和无操作脚本调用它。

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

修改

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

答案 4 :(得分:1)

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

gem install zeus

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

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

答案 5 :(得分:0)

刷新!一段时间以来一直是一个问题。看看this。您可以使用一些补丁以及有关如何解决问题的一些提示。

重装方法本身就是这样。

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

您始终可以将环境添加到此方法以覆盖其功能并强制重新加载所需的内容。

这对我有用,请告诉我们它是否适合您。一切顺利。

答案 6 :(得分:0)

很老的问题和答案,但它仍然是一个有用的...

不知何故,jqr 答案有错误,这似乎与自动加载有关(rails 5.2 ...)。

-e:1:in `<main>'                                                                                                                                                                                           
0.002514 require i18n/config                                                                                                                                                                               
.../vendor/bundle-dev/ruby/2.7.0/gems/i18n-1.8.7/lib/i18n.rb:19:in `<module:I18n>': uninitialized constant I18n::Config                                           
Did you mean?  RbConfig (NameError)                                                 

解决了这个问题:

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