为什么Rails Bootstrap这么慢,我该怎么办?

Why is rails bootstrap so slow and what can I do about it?

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秒!为什么!?


查看spork。它实际上运行着一台小型服务器,该服务器运行引导程序,然后等待测试运行,从而使您可以自举一次,然后从该状态进行多次测试。如果对配置进行了某些类型的更改,您有时会不得不重新启动它,但是在大多数情况下,它可以让您真正快速地进行红绿重构的迭代。


引用Yehuda Katz的话:

There are things that the C require code does in 1.9 that slow things down. One such example is re-checking $LOAD_PATH to make sure it is all expanded on every require. This is something that should be addressed by ruby-core. Ia€?ll open a ticket on redmine if there isna€?t one already.

I am also experiencing this problem and a $LOAD_PATH issue seems like a potential cause. Lets hope it gets fixed soon.

在我看来,您只需要忍受这一切,并希望它将在Ruby 1.9.3中得到修复。


问题似乎是require的缓慢性,如果您像

那样进行一些最小化分析

1
2
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?
您是否尝试过在没有捆绑程序/ ruby??gems的情况下运行测试/引导?


是的,它有点慢。噢,等等,在我的Java时代,mvn install从来没有花费不到一分钟的时间。使用mvn clean install时,疯狂的速度很慢。快乐的日子,记住总是让我振作起来。

1 spork,如@hammar建议的

guard结合使用https://github.com/guard/guard-test可以自动启动测试,并且您有一个杀手comb。让它在自己的窗口和/或屏幕中运行,以提高生产率:)

更新/添加答案:

优化技巧:在application.rb中添加到添加到autoload_paths的路径上to_s,避免它在运行时反复手动执行。可能会刮掉几秒钟...


为不必编写\\'require \\'语句而付出的代价是一种折衷。 Rails试图做正确的事情,因此会预加载所有内容。基本上,您有两种解决方案:

  • 使用产生Rails流程的预加载库(例如,spork)
  • 不要在测试中使用Rails,而是提取可以在Rails之外进行测试的域("销毁所有软件"对此进行了截屏)。归结为在可能的情况下跳过加载Rails。
  • 使用解决方案1)我说的全部。并且让我的套件运行不到半秒(仅进行70次测试,但是等待Rails加载的可能性很小)


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

    好消息是,有一个修补程序可以极大地加快Ruby的启动速度(require)。


    正如@ user185374所说,您正在权衡require的权衡。

    我偶然发现了一个有趣的资源,可以在不使用Rails的情况下加快Rails的测试速度。...示例是用Rspec给出的,但是您会明白逻辑。

    作者是这样总结的:

    I can't tell you what it means to run
    all of my 150+ specs within 2 seconds.
    I think it's a little bit of an extra
    work, but it's well worth the effort!

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

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


    查看宙斯ruby。

    这应该可以大大加快速度。


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