2011-04-21 113 views
49

Rails 3.0是一个严重的狗。我在Rails上开发了5年,并且从未慢慢启动。特别是,测试永远引导到顶级带有SSD的MacBook,因此迭代周期受到严重影响。每次我开始测试时,我都需要阅读一篇文章。这是疯狂的,而不是“敏捷”。我不妨编译一下。为什么rails的bootstrap这么慢,我该怎么办呢?

这是我最终从Rails开始的主要动机 - 当我有机会的时候。

如果有人有解决方案,请提供。我知道很多人都患有这个问题。

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

我使用的是faster_require和rails-dev-boost,但没有明显的影响。

我在红宝石1.9.2上,需要。一个非常简单的控制器测试需要26秒的双核2.13 Ghz MacBook Air与4Gb RAM和SSD!为什么!?

+2

同样的事情在这里。你可能想要考虑的一件事是perftools.rb。 https://github.com/tmm1/perftools.rb – 2011-05-15 15:53:32

+0

看起来像[红宝石1.9.3正在加载时间显着提升](http://www.rubyinside。COM /红宝石1-9-3更快的加载倍-要求-4927.html)。 – hammar 2011-06-05 06:42:05

+3

尝试处理您的接受评级:p – 2011-08-02 16:53:57

回答

8

引述耶胡达·卡茨:

有些事情,在C需要代码不会在1.9慢的东西下。一个这样的例子是重新检查$ LOAD_PATH以确保它在所有需要时都被扩展。这是ruby-core应该解决的问题。如果还没有,我会在redmine上打开一张票。

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

所以这听起来像你只需要忍受这一点,希望它会在Ruby 1.9.3中修复。

+0

好找。参考:http://groups.google.com/group/rubyonrails-core/browse_thread/thread/88519ef5a53088a1/c01ba447c6dc0de7?lnk=raot – 2011-05-24 04:05:36

+0

这看起来好像可能是相关的(我意识到提交已经快一年了,但我相信这不是在1.9.2)。 https://github.com/ruby/ruby/commit/2db572514cd9f5cc8957ab8f35f39650bb243ea7尝试Ruby的“边缘”构建以查看问题是否已解决将会很有趣。 – bratsche 2011-05-25 17:26:47

+0

在rvm中,我为当前项目在“rake路线”上做了ruby-1.9.2-p180和ruby-head之间的快速比较,发现ruby-head速度快了大约16%。虽然这并不是很科学(我还没有用1.8.7进行测试,因为这个项目在1.8.7版本上无法运行),但也许它仍然很有趣。 – bratsche 2011-05-25 18:14:51

18

结账spork。它本质上运行一个运行引导的小型服务器,然后等待测试运行,允许您引导一次,然后从该状态进行多次测试。如果您对配置进行了某些更改,您偶尔必须重新启动它,但大多数情况下,它可以让您实现快速的红绿重构迭代。

+1

仅适用于rspec的spork吗?我使用test :: unit和shoulda。另外 - 对测试的改进有所帮助,但它并不能真正解决基本问题。 – 2011-04-21 05:02:38

+0

有[test :: unit的版本](https://github.com/timcharper/spork-testunit)。我同意这不是一个完整的解决方案,但它在这个用例中有很大的帮助。 – hammar 2011-04-21 05:58:42

+0

Spork也可以使用Test :: Unit。请记住,使用Sporks有一些“陷阱”,我编译了一个链接列表,它将帮助您克服它们:https://gist.github.com/1118210 – arikfr 2011-09-08 08:01:06

3

无需编写'require'语句就可以付出代价。 Rails正在尝试做正确的事情,并因此预先载入所有内容。基本上有两种解决方法:

的滋生Rails的进程(例如 叉勺
  • 不要在您的测试中使用的Rails,提取物领域,你可以测试的Rails之外
    1. 使用预装库(销毁所有软件有关于此的一个截屏)。它归结为跳过加载轨道,如果可能的话。

    说了这么多,使用解决方案1)。并有我一套下半秒运行(只有70测试,但waitng为Rails加载最小)

  • 7

    问题似乎是需要缓慢,如果你做一些最起码的分析一样

    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上(另一种选择是在加载装置中看到很多它,但我想你已经知道这不是问题)。

    在我的盒子里(OSX上的MacBook Pro 2011 13“,带有核心i5和一个旋转硬盘驱动器),时间大约为5秒,但仍然很多,但可以更容忍,所以也许这是值得探讨的差异。

    多少宝石你已经安装在你的系统? 你试过没有捆绑/ RubyGems的运行测试/启动?

    +0

    如何在没有bundler和rubygems的情况下运行测试?它们是应用程序和所有测试的依赖关系。 – 2011-05-17 03:41:11

    +0

    你应该能够解包你的宝石供应商/(捆绑应该绕过全球rubygems查找)。如果你删除了gemfile,那么在任何情况下都不应该使用bundler。最后,你可以注释掉config/boot.rb中加载/调用设置的行,并将其替换为自定义需求。这么晚才回复很抱歉。 – riffraff 2011-05-19 16:54:49

    +0

    有趣的方法。我已经完成了“bundle -path vendor /”,然后是“bundle package”,但是从boot.rb删除相关行无法加载打包的gem。我不想删除我的Gemfile,因为我想使用捆绑器。 – 2011-05-23 21:36:35

    3

    是的,这是非常可笑缓慢的。哦,等等,mvn install在我Java日子从来没有花费不到一分钟的时间,mvn clean install这是疯狂的缓慢。快乐的日子,记住总是让我的精神上升。

    +1 spork,作为@hammar建议

    guardhttps://github.com/guard/guard-test结合起来,自动启动测试,你有一个杀手组合。有它在它自己的窗口和/或屏幕上运行,看看你的工作效率上去了:)

    更新/除了回答:

    优化提示:穿上路径to_s加入autoload_paths,在application.rb中,避免它来反复手动执行此操作。可能需要几秒钟...

    2

    正如@ user185374所说,您要支付require的权衡。

    我偶然发现了一个有趣的resource不使用Rails加快Rails测试...这个例子给出了与Rspec但你必须的逻辑。

    下面是笔者在总结:

    我不能告诉你这是什么意思2秒内运行 我所有的150+规格的。 我认为这是一个额外的 工作的一点点,但它是非常值得的努力!

    另一种解决方案我刚刚发现:Hydra并行测试:

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

    +0

    您忘记了链接? – 2011-05-22 17:06:22

    +0

    该死的,我搞砸了:)纠正 – apneadiving 2011-05-22 17:15:51

    2

    这是一个已知的问题,特别是在Ruby 1.9.2上。

    好消息是,有a patch加速Ruby启动(require)非常。

    0

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

    0

    查看zeus gem

    这应该会显着加快速度。