红宝石 – 为什么我的宝石需要这么长时间才能加载?

我正在开发我的第一个宝石叫做 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

并将该文件放在您的路径的任何地方. RubyGems自动为您提供,但当然您也可以接受RubyGems的开销.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...