18

更新 2这是 Ruby 1.9.2 加载文件方式的一个已知错误/功能。 http://twitter.com/#!/rails/status/72801149769621504

更新:这开始是一个问题,但经过一段时间的研究后,我认为它可能无法修复。我想我会发布这个,以防其他人看到同样的事情并且想知道 rails 和 bundler 内部发生了什么。

还有其他人在他们的 Rails 3 应用程序中看到很长的加载时间吗?我在 environment.rb、application.rb、boot.rb 和 railties/lib/rails/initializable.rb 中放置了计时器。时间以秒为单位,经过的时间是自上次记录时间以来的时间。生产加载时间需要更长的时间。部分原因是硬件较少,也来自 eager_load!(也许来自 Thin vs Mongrel)。看起来 Bundler 占用了很大一部分加载时间,我想这是可以预料的。我在 dev 和 prod 中测试了一个应用程序,在 dev 中测试了一个空白应用程序。我测试了 2 个应用服务器只是为了看看它是否是 Thin 导致的。我在产品中也看到了与乘客类似的事情(这使得它在 2.2.15 中无法使用产卵行为)。我针对 edge Rails 进行了测试,开发中的性能在 14.5 秒和 14.2 秒之间稍差。如果我删除我的测试依赖项,它可以节省 2-3 秒,但这在我运行测试时没有帮助。我想在我的测试运行之前等待 5 分钟让我的所有瘦实例重新启动并等待 15 秒只是有点烦人,但在这一点上这是一个可以接受的权衡,因为我在 Rails 3 中获得了生产力。如果有人有任何有助于加快速度的想法,我全神贯注。以下是测试结果:

注意:我在 Rails 2.3 中的应用程序在 dev 中加载不到 3 秒(尽管自从迁移到 rails3 后,我已经将一些代码转换为引擎并添加了 haml 和 twitter_oauth gem)

**使用 Rails 3RC 和 Ruby 1.9.2rc2 进行的所有测试

Prod with Thin - CentOS 5.5,Rackspace 云服务器 2GB 实例
测试应用程序 #1,具有 24 个 gem 依赖项

启动 env.rb - Total=0
  启动 app.rb - 0.00110546 已过。总计=0.001180052  
    启动 boot.rb - 0.000600488 已过。总计=0.00178644    
    结束 boot.rb - 0.7935529 已过。总计=0.795507318  
    开始需要 rails/all - 0.000189127 已过。总计=0.795701199  
    结束需要 rails/all - 1.086998364已过。总计=1.882735263  
    启动 Bundler 要求 - 0.000109708 已过。总计=1.88285043  
    end Bundler 要求 - 8.955853243已过。总计=10.838746673  
  结束 app.rb - 0.062975913 已过。总计=10.901753753  
  # /railties-3.0.0.rc/lib/rails/initializable.rb
  开始运行初始化程序 - 0.000145906 已过。总计=10.901910186  
    load_environment_config - 0.116689774 已过。总计=11.018632298  
    initialize_cache - 0.246161343 已过。总计=11.320543397  
    active_record.initialize_database - 0.080047485 已过。总计=11.400961893  
    bootstrap_hook - 1.034189984 已过。总计=12.451309104  
    active_support.initialize_time_zone - 1.969821814 已过。总计=14.448777651  
    action_controller.set_configs - 0.594991537 已过。总计=15.044692126  
    will_paginate.active_record - 0.324460921 已过。总计=15.386837641  
    will_paginate.action_view - 1.904889132已过。总计=17.328981523  
    add_view_paths - 0.087811847 已过。总计=17.42011881  
    load_init_rb - 0.151282681 已过。总计=17.709093173  
    load_init_rb - 0.362241273 已过。总计=18.071865548  
    load_config_initializers - 0.144051305 已过。总计=18.217433492  
    build_middleware_stack - 2.569453884已过。总计=20.826842081  
    急切的加载!- 4.165919064已过。总计=24.99280168  
    Finisher_hook - 0.48795935 已过。总计=25.480807439  
    repopulate_roles - 0.504085662 已过。总计=25.984901297  
  结束运行初始化程序 - ~0.00005 已过。总计=25.985617783  
结束 env.rb - ~0.00006 已过。总计=25.985683903  

Dev with Mongrel - Max OSX 10.5.8, 2.66 Core2duo, 4GB RAM
Test App #1 与 24 个 gem 依赖项

启动 boot.rb (Bundler.setup) - 2.0e-05 已过。总计=3.1e-05  
结束 boot.rb (Bundler.setup) - 2.352435已过。总计=2.352915  
启动 app.rb - 0.084945 已过。总计=2.437866  
  开始需要 rails/all - 0.000181 已过。总计=2.438049  
  结束需要 rails/all - 0.489425 已过。总计=2.927485  
  启动 Bundler.require(:default, Rails.env) - 5.6e-05 已过。总计=2.927544  
  end Bundler.require(:default, Rails.env) - 5.16162已过。总计=8.089177  
结束 app.rb - 0.025972 已过。总计=8.11516  
启动 env.rb - 0.084153 已过。总计=8.199329
  # /railties-3.0.0.rc/lib/rails/initializable.rb
  启动 run_initializers - 0.002709 已过。总计=8.202042   
    初始化缓存 - 0.089231 已过。总计=8.518005  
    bootstrap_hook - 0.602342 已过。总计=9.192564  
    active_support.initialize_time_zone - 0.901676已过。总计=10.10115  
    action_controller.set_configs - 0.375864 已过。总计=10.477565  
    will_paginate.active_record - 0.207447 已过。总计=10.694479  
    will_paginate.action_view - 1.041412已过。总计=11.75974  
    load_init_rb - 0.051938 已过。总计=11.879547  
    load_init_rb - 0.082936 已过。总计=12.001311  
    load_init_rb - 0.18798 已过。总计=12.189555  
    load_config_initializers - 0.079461 已过。总计=12.269971  
    build_middleware_stack - 1.390042已过。总计=13.729273  
    Finisher_hook - 0.082274 已过。总计=13.811648  
    repopulate_roles - 0.350287 已过。总计=14.161941  
  结束 run_initializers - 3.0e-06 已过。总计=14.177869  
结束 env.rb - 0.000127 已过。总计=14.178002  

使用 Mongrel Test App #2 进行开发,具有 2 个 gem 依赖项

启动 boot.rb (Bundler.setup) - Total=0
结束 boot.rb (Bundler.setup) - 1.724158已过。总计=1.724199
启动 app.rb - 0.041006 已过。总计=1.765211
  开始需要 rails - 0.000151 已过。总计=1.765364
  结束需要导轨 - 0.360051 已过。总计=2.125426
  启动 Bundler.require(:default, Rails.env) - 5.5e-05 已过。总计=2.125485
  end Bundler.require(:default, Rails.env) - 0.008396 已过。总计=2.133889
结束 app.rb - 0.007805 已过。总计=2.141704
启动 env.rb - 0.16541 已过。总计=2.307128
  启动 run_initializers - 0.00031 已过。总计=2.307442
    load_active_support - 0.24045 已过。总计=2.579421
    active_support.initialize_time_zone - 0.206237 已过。总计=2.837663
    action_controller.deprecated_routes - 0.210291 已过。总计=3.048634
    build_middleware_stack - 0.220663 已过。总计=3.273035
  结束 run_initializers - 3.0e-06 已过。总计=3.29339
结束 env.rb - 8.7e-05 已过。总计=3.293483
4

3 回答 3

2

由于这是一个相当古老的问题:您是否使用 Rails 3 的发布版本对其进行了测试?

那是一段很长的时间,但最终毫无意义。我的 Rails 应用程序一次可以运行几个月,所以这只是总运行时间 1% 的一小部分。

您是否有大量依赖项需要 Bundler 处理?在任何环境中,我都可以在不到 2 秒的时间内启动我的 Rails 3 应用程序,但我很少使用第三方 gem。

于 2010-09-19T20:48:30.887 回答
2

Bundler 经常花费一半以上的时间需要 gems。您在开发/测试模式下加载的任何依赖项是否都是不必要的?例如,我的一些 gem 仅由 resque 工作人员或其他脚本使用。当您需要它们以在开发/测试模式下获得一些适度的启动速度提升时,您可以添加:require => false然后手动要求它们。

在这样做之前,我通常会分析 require 语句(在 lib/bundler/runtime.rb 中)以查看它们是否真的值得取出。

于 2010-10-16T00:32:57.073 回答
0

我有 3 个 rails 3 应用程序,我正在从 2.3.8 迁移一个,在 rails 2.3.8 上的一个在 4 秒内加载,在 rails 3 中途的分支需要 12 秒,所有其他 rails 3 项目从 20加载到 30 秒,当我看到有人在 3 秒内加载他的 rails 应用程序的截屏视频时,我感到非常沮丧,自从我迁移到 rails 3 后,我一直认为这是我的环境。

于 2011-04-12T20:09:23.927 回答