为什么'rspec spec'比'bundle exec spec'运行得更快,使用的资源更少

时间:2011-06-03 04:07:32

标签: ruby-on-rails ruby rspec bundler

以下是在相当简单的rails 3 app上使用time rspec spec vs time bundle exec spec进行的3次随机游戏。不使用bundler的速度一直更快,它使用的资源更少,6%vs 17%cpu。

我确定它与处理依赖项的bundler有关,但我想更好地理解这个问题。我尝试练习TDD,所以我当然多天都会进行多次测试。如果使用bundle exec会在速度和资源方面“花费”我,那么我很想找到一种方法来避免使用bundle exec

我正在使用rails 3.0.3,ruby 1.9.2,rspec 2.3,bundler 1.0.10

rspec spec  0.47s user 0.13s system 6% cpu 8.758 total
rspec spec  0.47s user 0.12s system 6% cpu 8.521 total
rspec spec  0.46s user 0.12s system 6% cpu 8.528 total

bundle exec rspec spec  1.35s user 0.30s system 17% cpu 9.293 total
bundle exec rspec spec  1.39s user 0.31s system 17% cpu 9.749 total
bundle exec rspec spec  1.37s user 0.30s system 17% cpu 9.490 total

2 个答案:

答案 0 :(得分:1)

我推测Bundler必须在开始命令之前动态解析gemfile中的所有gem。

尝试

bundle exec gem list | wc -l

gem list | wc -l

在这台机器上的一个简单的rails 3项目中,我分别得到25颗和92颗宝石。

同样尝试使用简单的“ls”命令,你仍然可以看到速度差异。

答案 1 :(得分:1)

这并不能直接回答你的问题,直到为什么一个慢。但我想至少对于后来发现这一点的人说,在不使用bundle exec的情况下运行可执行文件通常只是巧合。引用Bundler文档:

  

在某些情况下,运行可执行文件   没有捆绑exec可能会工作,如果   可执行文件恰好安装在   你的系统,并没有拉入任何   与你的捆绑包冲突的宝石。

     

但是,这是不可靠的   相当痛苦的根源。即使   看起来它有效,但可能没有   在将来工作或在另一工作   机。