18

我使用几个 Rails 应用程序,一些在 Rails 3.2/Ruby 2.0 上,还有一些在 Rails 2.3/Ruby 1.8.7 上。

它们的共同点是,随着它们的增长和添加更多的依赖项/宝石,它们需要越来越长的时间才能开始。开发、测试、生产、控制台,没关系;有些需要60多秒。

首先,分析导致加载时间如此缓慢的原因,第二,改善加载时间的首选方法是什么?

4

3 回答 3

19

有几件事会导致这种情况。

  1. GC 传递次数过多和 VM 的一般缺点 - 请参阅此答案以获得全面的解释。Ruby <2.0 有一些非常慢的位,可以显着提高加载速度;使用 Falcon 或 railsexpress 补丁编译 Ruby 可以极大地帮助实现这一点。默认情况下,所有版本的 MRI Ruby 都使用不适合 Rails 应用程序的 GC 设置。
  2. 许多遗留的 gem 必须被迭代才能加载文件。如果您使用捆绑器,请尝试bundle clean. 如果您使用的是 RVM,您可以尝试创建一个新的 gemset。

就分析而言,您可以使用 ruby​​-prof 来分析启动应用程序时发生的情况。您可以包装config/environment.rb在 ruby​​-prof 块中,然后使用它来生成引导周期的配置文件报告,例如rails r ''. 这可以帮助您跟踪您在启动时花费的大部分时间。您也可以分析各个部分,例如 中的捆绑程序设置boot.rb或 中的#initialize!调用environment.rb

您可能没有考虑的是 DNS 超时。如果您的应用程序在启动时执行 DNS 查找,但它无法解析,这些可能会阻塞进程 $timeout 秒(在某些情况下可能高达 30 秒!)。您也可以针对这些审核应用程序。

于 2013-07-02T23:48:02.207 回答
13

Ryan 有一个关于加速测试、控制台、rake 任务的很好的教程: http ://railscasts.com/episodes/412-fast-rails-commands?view=asciicast

我检查了那里的每一种方法,发现“弹簧”是最好的。只需运行以下任务:

$ spring rspec 

你第一次跑春天的时间和以前一样,但第二次和以后的时间会快得多。

另外,根据我的经验,当出现奇怪的错误时,您需要停止 spring server 并重新启动,但这种机会很少。

于 2013-07-03T01:30:53.147 回答
0

对于 ruby​​ 2 应用程序,请尝试 zeus - https://github.com/burke/zeus

1.8 应用程序的启动速度似乎比 1.9 快得多,spork 可能有帮助吗?http://railscasts.com/episodes/285-spork

于 2013-07-02T23:46:37.030 回答