我正在开发我的第一个宝石叫做
t_time_tracker(woohoo!).一切都在发展中伟大;我尽可能地将它的执行时间缩短到了最低限度:
t_time_tracker[master*]% time ruby -Ilib ./bin/t_time_tracker You're not working on anything 0.07s user 0.03s system 67% cpu 0.141 total
(这是我的应用程序的“你好世界” – 调用它没有参数只打印出“你不工作任何东西”)
大约十分之一秒,使用我的cpu的67% – 酷,我可以生活在那里.感觉相当瞬间我们来构建它:
$gem build t_time_tracker.gemspec $gem install ./t_time_tracker-0.0.0.gem
并且与安装的二进制文件完全相同:
$time t_time_tracker You're not working on anything t_time_tracker 0.42s user 0.06s system 93% cpu 0.513 total
半秒钟?这是从哪里来的?我们添加一些调试输出,并从开发二进制文件中包含系统gem,以查看瓶颈在哪里:
t_time_tracker[master*]% time ruby ./bin/t_time_tracker (starting binary) (require 'time' and 'optparse') 0.041432 (before `require 't_time_tracker') 0.497135 (after `require 't_time_tracker') (Gem.loaded_specs.keys = t_time_tracker) (initializing TTimeTracker class) You're not working on anything ruby ./bin/t_time_tracker 0.44s user 0.07s system 91% cpu 0.551 total
好的,所以`require’t_time_tracker’线似乎是罪魁祸首.让我们再来一次irb来进一步缩小:
$irb >> t=Time.now; require 't_time_tracker'; puts Time.now-t 0.046792 => nil
…什么?但那只是半秒钟!我们尝试用我们的调试输出构建gem:
$gem build t_time_tracker.gemspec $gem install ./t_time_tracker-0.0.0.gem $time t_time_tracker (starting binary) <---noticeable half second delay before this line shows up (require 'time' and 'optparse') 0.050458 (before `require 't_time_tracker') 0.073789 (after `require 't_time_tracker') (Gem.loaded_specs.keys = t_time_tracker) (initializing TTimeTracker class) You're not working on anything t_time_tracker 0.42s user 0.06s system 88% cpu 0.546 total
那么是的,这个0.5秒的延迟来自哪里?我通常不会在意,但这是我每天要约五十次更新我正在做的事情. 50 * 0.5秒* 365天* 70岁= 15天失去生命.
系统信息:
Mac OS X 10.7.3. 2 GHz Intel Core 2 Duo. 4 GB公斤红宝石1.9.2p290.
% gem -v 1.8.10<---noticeable half second delay before this line shows up % gem list | wc -l 209
解决方法
过去一段时间以来,RubyGems在过去(也许是现在)中花了很长时间才能加载,主要有两个原因:
>它将通过’yaml’加载许多相对昂贵的库,如’time’.通常你不在乎,因为它相对于ruby本身慢,与许多脚本的运行时间相比并不慢.
>它将扫描所有安装的宝石,并将最新的gemspecs加载到内存中.如果你有很多宝石,这需要很长时间.
这些问题可能还可能还没有发挥作用.但是,您将始终有一些RubyGems的开销.如果你真的需要性能,那么只需自己设置你的加载路径!没有RubyGem的Ruby是非常快的,如你所知.
看看你的宝石的安装位置:
gem list -d YOUR_GEM_NAME
你会看到安装目录.您的宝石将在INSTALL_DIR / gems / GEM_NAME-VERSION上,请尝试执行:
time ruby -IINSTALL_DIR/gems/GEM_NAME-VERSION/lib INSTALL_DIR/gems/GEM_NAME-VERSION/bin/t_time_tracker
这很多,但是你应该可以将它包装在一个单独的脚本中,像这样(命名为t_time_tracker):
#!/usr/bin/env ruby -IINSTALL_DIR/gems/GEM_NAME-VERSION/lib load 'INSTALL_DIR/gems/GEM_NAME-VERSION/bin/t_time_tracker'
然后:
chmod +x t_time_tracker time ./t_time_tracker