【问题标题】:Why is rails bootstrap so slow and what can I do about it?为什么 rails bootstrap 这么慢,我该怎么办?
【发布时间】:2011-04-21 01:13:12
【问题描述】:

Rails 3.0 是一只严肃的狗。我已经在 Rails 上开发了 5 年,而且启动速度从未如此缓慢。特别是,在配备 SSD 的顶级 MacBook 上启动测试需要很长时间,因此迭代周期受到严重影响。每次开始测试时,我都需要阅读一篇文章。这是疯狂的,而不是“敏捷”。我还不如编译。

这是我最终离开 Rails 的主要动力——当我有机会时。

如果有人有解决方案,请提供。我知道很多人都受到这个问题的困扰。

我不使用 rspec - 我知道有一个解决方案可以帮助测试 rspec。

我正在使用 faster_require 和 rails-dev-boost,但没有显着影响。

我正在使用 ruby​​ 1.9.2 并且需要。在配备 4Gb RAM 和 SSD 的双核 2.13 Ghz MacBook Air 上,一个非常简单的控制器测试需要 26 秒!为什么!?

【问题讨论】:

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


【解决方案1】:

查看spork。它本质上运行一个小型服务器,该服务器运行引导程序,然后等待测试运行,允许您引导一次,然后从该状态进行多次测试。如果您对配置进行某些类型的更改,您有时需要重新启动它,但在大多数情况下,它可以让您真正快速地进行红绿重构迭代。

【讨论】:

  • spork 不只适用于 rspec 吗?我使用 test::unit 和 shoulda。另外 - 对测试的改进会有所帮助,但它并不能真正解决根本问题。
  • a version for test::unit。我同意这不是一个完整的解决方案,但它在这个用例中很有帮助。
  • Spork 也可以与 Test::Unit 一起使用。请记住,使用 Sporks 有一些“陷阱”,我编制了一个链接列表,可以帮助您克服它们:gist.github.com/1118210
【解决方案2】:

引用耶胡达·卡茨的话:

C 要求代码在 1.9 中执行的某些操作会减慢速度。一个这样的例子是重新检查 $LOAD_PATH 以确保它在每个需要时都被扩展。这是 ruby​​-core 应该解决的问题。如果还没有,我会在 redmine 上开一张票。

我也遇到了这个问题,$LOAD_PATH 问题似乎是一个潜在原因。让我们希望它尽快得到修复。

所以在我看来,你只需要忍受这个,希望它会在 Ruby 1.9.3 中得到修复。

【讨论】:

  • 这看起来可能是相关的(我意识到提交已经快一年了,但我相信这不在 1.9.2 中)。 github.com/ruby/ruby/commit/… 尝试 Ruby 的“边缘”构建看看问题是否得到解决会很有趣。
  • 借助 rvm,我在当前项目的“rake routes”上对 ruby​​-1.9.2-p180 和 ruby​​-head 进行了快速比较,发现 ruby​​-head 快了大约 16%。虽然这不是很科学(而且我没有用 1.8.7 测试过,因为这个项目在 1.8.7 上不起作用),但也许它仍然很有趣。
【解决方案3】:

问题似乎是 require 的缓慢,如果你做一些最小的分析,比如

CPUPROFILE=/tmp/my_app_profile RUBYOPT="-r`gem which perftools | tail -1`" ruby -I lib:test test/unit/user_test.rb
pprof.rb --text /tmp/my_app_profile

您可能应该看到在 require 中花费了很多时间(另一种选择是在加载夹具时看到很多时间,但我想您已经知道这不是问题所在)。

在我的盒子里(Macbook pro 2011 13 上的 osx,带有核心 i5 和旋转硬盘),时间大约为 5 秒,这仍然很多,但更容易忍受,所以也许是值得研究差异。

您的系统中安装了多少个 gem? 您是否尝试过在没有捆绑程序/rubygems 的情况下运行测试/启动?

【讨论】:

  • 如何在没有 bundler 和 ruby​​gems 的情况下运行测试?它们是应用程序和所有测试的依赖项。
  • 您应该能够在 vendor/ 中解压缩您的 gem(然后捆绑器应该绕过全局 ruby​​gems 查找)。如果您删除 gemfile,那么在任何情况下都不应使用 bundler。最后,您可以注释掉 config/boot.rb 中加载它/调用设置的行,并将它们替换为自定义要求。抱歉回复晚了。
  • 有趣的方法。我已经完成了“bundle --path vendor/”,然后是“bundle package”,但是从 boot.rb 中删除相关行无法加载打包的 gem。我不想删除我的 Gemfile,因为我想使用 bundler。
  • 上面的shell sn -p 缺少第一行:gem install perftools.rb
【解决方案4】:

为不必编写“要求”语句而付出代价是一种折衷。 Rails 正在尝试做正确的事情,因此会预加载所有内容。基本上你有两种解决方案:

  1. 使用生成 Rails 进程的预加载库(例如 spork
  2. 不要在测试中使用 Rails,提取可以在 Rails 之外测试的域(Destroy All Software 有一个关于此的截屏视频)。归结为尽可能跳过加载 Rails

我说了这么多,使用解决方案 1)。并且让我的套件在半秒内运行(只有 70 个测试,但等待 Rails 加载的时间很少)

【讨论】:

    【解决方案5】:

    是的,它非常慢。哦,等等,mvn install 在我的 Java 时代从来没有不到一分钟。使用mvn clean install 非常慢。快乐的日子,回忆总是让我精神振奋。

    +1 spork,正如@hammar 建议的那样

    结合guard https://github.com/guard/guard-test 自动启动测试,你就有了一个杀手锏。让它在自己的窗口和/或屏幕上运行,看看你的工作效率会提高吗:)

    更新/补充回答:

    优化提示:在 application.rb 中添加到 autoload_paths 的路径上添加 to_s,避免它在运行时一遍又一遍地手动执行此操作。可能会剃掉几秒钟...

    【讨论】:

      【解决方案6】:

      正如@user185374 所说,您正在为require 付出代价。

      我偶然发现了一个有趣的resource 来加速Rails 测试而不使用Rails...这个例子是用Rspec 给出的,但你会有逻辑。

      作者总结如下:

      我无法告诉你跑步意味着什么 在 2 秒内完成我所有的 150 多个规格。 我认为这有点额外 工作,但值得付出努力!

      我刚刚找到的另一个解决方案:Hydra并行测试:

      http://logicalfriday.com/2011/05/18/faster-rails-tests-with-hydra/

      【讨论】:

        【解决方案7】:

        这是一个已知问题,尤其是在 Ruby 1.9.2 上。

        好消息是a patch 极大地加速了 Ruby 的启动 (require)。

        【讨论】:

          【解决方案8】:

          好消息。升级到 Ruby 1.9.3 后,Rails 在可容忍的时间内启动。

          【讨论】:

            【解决方案9】:

            查看zeus gem

            这应该会大大加快速度。

            【讨论】:

              猜你喜欢
              • 2014-03-07
              • 1970-01-01
              • 2013-11-14
              • 2021-04-27
              • 1970-01-01
              • 2021-10-01
              • 2013-08-30
              • 1970-01-01
              相关资源
              最近更新 更多