2012-05-17 3 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 

(это «привет мир» из моего приложения - назвав его без параметров просто выводит «Вы» не работаю ни на что »)

Около десятой части секунды и использует 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 ГГц Intel Core 2 Duo. 4 ГБ оперативной памяти. ruby 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. Hmmm ... – cgenco

+0

После 'gem install rails',' gem list | wc -l' = 33, а время t составляет в среднем около 0,21. Является ли решение просто «не устанавливать много драгоценных камней»? – cgenco

ответ

2

было некоторое время, так как я смотрел на это, но RubyGems уже в прошлом (и, возможно, в настоящее время), потребовалось много времени, чтобы загрузить в основном по двум причинам:

  • Было бы нагрузить много относительно дорогие библиотеки как «время» через «yaml». Обычно вам все равно, потому что он медленный по отношению к рубину сам по себе, а не медленный по сравнению с временем выполнения многих скриптов.
  • Он сканирует все установленные драгоценные камни и загружает последние данные gemspecs в память. Это заняло много времени, если у вас много драгоценных камней.

Эти проблемы могут или не могут быть воспроизведены. Однако у вас будет всегда есть некоторые накладные расходы от RubyGems. Если вам действительно нужна производительность, просто настройте свой путь загрузки самостоятельно! Как вы знаете, Ruby без RubyGems очень быстр.

Чтобы увидеть, где установлен ваш драгоценный камень:

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 

И поместить этот файл в любом месте по вашему PATH. RubyGems делает это автоматически, но, конечно же, вы принимаете накладные расходы RubyGems.

+0

отлично, но как насчет драгоценного камня, который распространяется среди других пользователей? – sixty4bit

0

Возможно, это потому, что у вас есть это «от местного» драгоценного камня. Так что рубину придется проверять другие пути, прежде чем он его поднимет.

например. если у вас будет файл под названием json.rb и камень, установленный во всем мире под названием JSon при выполнении

require 'json' 

он найдет первый камень и загрузить его :). Локальный путь загружается последним. Если вы соберете драгоценный камень и установите его, вы увидите значительное улучшение скорости только из-за разного расположения в драгоценных камнях. Я бы не стал беспокоиться об этом отсутствии времени загрузки в разработке.

0

$LOAD_PATH Используется в вашем драгоценном камне, вероятно, будет виновником. В идеале путь к вашей папке lib будет первым в этом массиве.

Смежные вопросы