Почему мой драгоценный камень так долго загружается?

Я разрабатываю свой первый гем под названием t_time_tracker(у-у-у!). Все шло отлично в разработке; Я максимально оптимизировал его, чтобы сократить время выполнения до минимума:

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

Итак, строка `require '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. Intel Core 2 Duo с тактовой частотой 2 ГГц. 4 ГБ ОЗУ. рубин 1.9.2p290.

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

14
задан cgenco 17 May 2012 в 05:20
поделиться