以下是在相当简单的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
答案 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可能会工作,如果 可执行文件恰好安装在 你的系统,并没有拉入任何 与你的捆绑包冲突的宝石。
但是,这是不可靠的 相当痛苦的根源。即使 看起来它有效,但可能没有 在将来工作或在另一工作 机。