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

下面是3个随机运行使用time rspec spec vs time bundle exec spec在一个相当简单的rails 3 app上。 不使用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 

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

在某些情况下,如果可执行文件恰好安装在您的系统中并且没有引入任何与您的软件包冲突的gem,那么运行没有bundle exec的可执行文件可能会有效。

然而,这是不可靠的,并且是相当痛苦的根源。 即使它看起来有效,但它可能在将来或其他机器上不起作用。

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

尝试

 bundle exec gem list | wc -l 

 gem list | wc -l 

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

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