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

(이 내 응용 프로그램의 "안녕하세요!"입니다 - 매개 변수없이 그것을 호출 그냥 출력 '당신' 다시 작업하지 않음 ")

약 10 분의 1 초에 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 

0.5 초를?! 그게 어디서 온거야?!

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 

... 무엇을할까요? 그러나 그것은 단지 0.5 초 걸렸다! 우리의 디버깅 결과를 가지고 보석을 만들자 :

$ 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 번 전화하는 것입니다. 50 * 0.5 초 * 365 일 * 70 년 = 생명 손실 15 일.

시스템 정보 :

Mac OS X 10.7.3. 2GHz Intel Core 2 Duo. 4GB 램. 루비 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

오랜만 :

  • 그것은 많은 상대적으로 고가의 라이브러리를로드 할 'yaml'을 통해 '시간'을 좋아하십시오. 대개 루비에 비례하여 느리게 진행되므로 많은 스크립트의 실행 시간에 비해 느리지 않기 때문에 보통 신경 쓰지 않습니다.
  • 설치된 모든 보석을 스캔하여 가장 최근의 gemspec을 메모리에로드합니다. 네가 보석을 많이 가지고 있다면 이것은 오랜 시간이 걸렸다.

이러한 문제는 계속 될 수 있습니다. 그러나 은 항상에 RubyGems의 오버 헤드가 있습니다. 성능이 정말로 필요한 경우 직접로드 경로를 설정하십시오! 루비 젬이없는 루비는 매우 빠르다. 당신의 보석이 설치되어있는

은 참조하십시오 :

gem list -d YOUR_GEM_NAME 

당신은 설치 디렉토리를 볼 수 있습니다.

많은,하지만 별도의 스크립트에서이 포장 할 수 있어야한다
time ruby -IINSTALL_DIR/gems/GEM_NAME-VERSION/lib INSTALL_DIR/gems/GEM_NAME-VERSION/bin/t_time_tracker 

, 이런 일이 (그것을 t_time_tracker 이름) : INSTALL_DIR/보석/GEM_NAME-VERSION 그렇게 실행 시도에 당신의 보석이 될 것입니다

그런 다음
#!/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 폴더의 경로가 해당 배열의 첫 번째 경로입니다. 내가 과거 (그리고 어쩌면 현재)에 주로 두 가지 이유로드하는 데 시간이 오래 촬영 젬이 가지고 있지만이 바라 보았다 이후

관련 문제