红宝石 – 为什么我的宝石需要这么长时间才能加载?
我正在开发我的第一个宝石叫做
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本身慢,与许多脚本的运行时间相比并不慢. 这些问题可能还可能还没有发挥作用.但是,您将始终有一些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 并将该文件放在您的路径的任何地方. RubyGems自动为您提供,但当然您也可以接受RubyGems的开销. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |