2012-05-17 33 views
14

Tôi đang phát triển đá quý đầu tiên của mình có tên là t_time_tracker (woohoo!). Tất cả đều phát triển rất tốt; Tôi optomized nó nhiều như tôi có thể có thể cắt giảm thời gian thực hiện xuống càng ít càng tốt:Tại sao đá quý của tôi mất quá nhiều thời gian để tải?

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 

(đây là "hello world" của ứng dụng của tôi - gọi đó là không có tham số chỉ cần in ra "Bạn' không làm việc gì cả ”)

Khoảng một phần mười giây và sử dụng 67% CPU của tôi - tuyệt, tôi có thể sống với điều đó. Nó cảm thấy khá tức thời. Hãy xây dựng nó:

$ gem build t_time_tracker.gemspec 
$ gem install ./t_time_tracker-0.0.0.gem 

Và làm điều chính xác cùng với nhị phân được cài đặt:

$ time t_time_tracker 
You're not working on anything 
t_time_tracker 0.42s user 0.06s system 93% cpu 0.513 total 

Nửa thứ hai ?! Thứ đó đã đến từ đâu?! Hãy thêm một số đầu ra gỡ lỗi và bao gồm các viên ngọc hệ thống từ nhị phân phát triển để xem nơi cổ chai là:

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 

Được rồi, do đó đòi hỏi dòng ` 't_time_tracker' có vẻ là thủ phạm. Hãy thử lại trong irb để thu hẹp thêm nữa:

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

... cái gì? Nhưng điều đó chỉ mất nửa giây! Hãy thử xây dựng đá quý với đầu ra gỡ lỗi của chúng tôi:

$ 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 

Vì vậy, thời gian trễ này là 0,5 giây? Tôi thường không quan tâm, nhưng đây là điều tôi gọi khoảng năm mươi lần một ngày để cập nhật những gì tôi đang làm. 50 * 0,5 giây * 365 ngày * 70 năm = 15 ngày mất mạng.

Thông tin hệ thống:

Mac OS X 10.7.3. 2 GHz Intel Core 2 Duo. RAM 4 GB. ruby 1.9.2p290.

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

Hiệu suất như thế nào trên 1.9.3? –

+0

Thú vị ... 'rvm 1.9.3 && gem install t_time_tracker' cho tôi thời gian thực hiện siêu nhanh của tôi một lần nữa (tổng số 0,00 giây), nhưng tôi nghi ngờ rằng đây chỉ là vì' danh sách đá quý | wc -l' = 7. Hmmm ... – cgenco

+0

Sau 'gem install rails',' gem list | wc -l' = 33 và 'thời gian t' là trung bình khoảng 0,21. Là giải pháp chỉ "không cài đặt rất nhiều đá quý"? – cgenco

Trả lời

2

Được một lúc kể từ khi tôi nhìn này nhưng RubyGems đã, trong quá khứ (và có lẽ hiện tại), thực hiện một thời gian dài để nạp cho chủ yếu là hai lý do:

  • Nó sẽ nạp nhiều thư viện tương đối đắt tiền như 'thời gian' qua 'yaml'. Thông thường bạn không quan tâm vì nó chậm tương đối so với ruby ​​tất cả bởi chính nó, không chậm so với thời gian chạy của nhiều kịch bản.
  • Nó sẽ quét qua tất cả các đá quý đã cài đặt và tải gemspec mới nhất vào bộ nhớ. Điều này mất một thời gian dài nếu bạn có rất nhiều đá quý.

Các sự cố này có thể có hoặc vẫn không hoạt động. Tuy nhiên, bạn sẽ luôn luôn có một số phí từ RubyGems. Nếu bạn thực sự cần hiệu suất, sau đó chỉ cần thiết lập đường dẫn tải của bạn cho mình! Ruby không có RubyGems rất nhanh, như bạn đã biết.

Để xem nơi đá quý của bạn được cài đặt:

gem list -d YOUR_GEM_NAME 

Bạn sẽ thấy thư mục cài đặt. đá quý của bạn sẽ có mặt tại INSTALL_DIR/đá quý/GEM_NAME-VERSION vì vậy hãy thử thực hiện:

time ruby -IINSTALL_DIR/gems/GEM_NAME-VERSION/lib INSTALL_DIR/gems/GEM_NAME-VERSION/bin/t_time_tracker 

Đó là rất nhiều, nhưng bạn sẽ có thể quấn này trong một kịch bản riêng biệt, một cái gì đó như thế này (tên nó 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' 

Sau đó:

chmod +x t_time_tracker 
time ./t_time_tracker 

Và đặt tập tin đó ở bất cứ đâu cùng PATH của bạn. RubyGems làm cho bạn tự động, nhưng tất nhiên bạn sau đó chấp nhận chi phí của RubyGems.

+0

tuyệt vời nhưng những gì về cho một viên ngọc đang được phân phối cho người dùng khác? – sixty4bit

0

Có thể vì bạn có đá quý "từ cục bộ". Vì vậy, ruby ​​sẽ phải kiểm tra các con đường khác trước khi anh ta đón anh ta.

ví dụ: nếu bạn sẽ có tệp có tên là json.rb và gem được cài đặt trên toàn cầu được gọi là json khi thực hiện

require 'json' 

anh ta sẽ tìm thấy đá quý đầu tiên và tải nó :). Đường dẫn cục bộ cuối cùng được tải. Nếu bạn sẽ bó đá quý và cài đặt, bạn sẽ thấy cải thiện tốc độ lớn chỉ vì vị trí khác nhau trong đá quý. Tôi sẽ không lo lắng nhiều về việc thiếu thời gian tải trong phát triển.

0

$LOAD_PATH được sử dụng trong đá quý của bạn có thể là thủ phạm. Lý tưởng nhất là đường dẫn cho thư mục lib của bạn là đầu tiên trên mảng đó.

Các vấn đề liên quan