2012-05-17 120 views
14

我正在开发我的第一个叫做t_time_tracker(woohoo!)的宝石。一切进展顺利;我optomized它,就像我可能可能削减执行时间降低到尽可能少的:为什么我的宝石需要这么长时间才能加载?

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 

半秒?那个是从哪里来的?!让我们添加一些调试输出,包括从开发二元系统的宝石,看看那里的瓶颈是:

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 

好了,所以'需要“t_time_tracker”线似乎是罪魁祸首。让我们再次尝试在irb中进一步缩小范围:

$ irb 
>> t=Time.now; require 't_time_tracker'; puts Time.now-t 
0.046792 
=> nil 

...什么?但那只是半秒钟!让我们尝试建立创业板与我们的调试输出:

$ 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 RAM。红宝石1.9.2p290。

% gem -v 
1.8.10<---noticeable half second delay before this line shows up 
% gem list | wc -l 
209 
+3

1.9.3的性能如何? –

+0

有趣的......'rvm 1.9.3 && gem install t_time_tracker'给了我超快的执行时间(总共0.100秒),但我怀疑这只是因为'gem list | wc -l' = 7.嗯...... – cgenco

+0

'gem install rails','gem list | wc -l'= 33,'时间t'约为0.21的平均值。解决方案只是“不要安装大量的宝石”? – cgenco

回答

2

已经有一段时间我看着这一点,但RubyGems的有,在过去的(也许本),花了很长时间来加载主要有两个原因:

  • 它会加载很多比较昂贵的图书馆像'时间'通过'yaml'。通常你不关心它,因为它相对于Ruby本身来说是相对较慢的,与许多脚本的运行时间相比,速度并不慢。
  • 它会扫描所有已安装的gem并将最新的gemspecs加载到内存中。如果你有很多宝石,这需要很长时间。

这些问题可能会也可能不会发挥作用。不过,你会从总是从RubyGems有一些开销。如果你真的需要性能,那么你自己设置你的负载路径!如你所知,没有RubyGems的Ruby非常快速。

看到的是安装在您的宝石,其中:

gem list -d YOUR_GEM_NAME 

你会看到安装目录。你的宝石将在INSTALL_DIR /宝石/ GEM_NAME-的版本,所以请尝试执行:

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的开销。

+0

很好,但是如何分配给其他用户的宝石呢? – sixty4bit

0

这可能是因为你有“从本地”的宝石。所以红宝石在接他之前必须检查其他路径。

例如。如果这样做

require 'json' 

当你将文件名为json.rb和创业板安装在全球范围称为JSON他会发现首批创业板并加载它:)。本地路径最后被加载。如果你将捆绑宝石和安装,你会看到巨大的速度提高,只是因为宝石中的不同位置。我不会担心在开发中缺少加载时间。

0

在宝石中使用的$LOAD_PATH可能是罪魁祸首。理想情况下,lib文件夹的路径首先在该阵列上。

相关问题