2011-01-04 60 views
11

Tôi đang viết một kịch bản Ruby 1.9.2 để đánh giá thời gian thực hiện của các lệnh gọi dòng bên ngoài khác nhau.đo thời gian thực hiện các cuộc gọi dòng lệnh

tôi đã sử dụng phương pháp ruby ​​Process.system để thực hiện các cuộc gọi dòng lệnh và cố gắng nắm bắt được thời gian thực hiện như sau:

start = Time.now 
system("./script1", "argX") 

puts "Duration: #{Time.now - start} seconds" 

Bây giờ tôi có vấn đề mà thời gian không phản ánh thời gian thực hiện của quá trình bên ngoài nhưng thời gian thực hiện của cuộc gọi "hệ thống".

Bất kỳ ý tưởng nào về cách tôi có thể đo thời gian thực hiện của quy trình bên ngoài?

Trả lời

2

Nếu tôi hiểu chính xác, bạn muốn thời gian quy trình Ruby thực thi tập lệnh của bạn. Khi bạn đang làm việc trên hệ thống * nix, bạn có thể sử dụng tiện ích time. Sau đó, bạn có thể làm như sau: time ruby *yourscript*

+0

cũng hoạt động trên mac running rvm –

+0

macs * nix systems haha ​​ – Jay

12

OK. Nếu tôi hiểu những gì bạn đang cố gắng làm, bạn muốn thời gian cuộc gọi "./script1" kéo dài bao lâu?

Một điều bạn có thể muốn làm là sử dụng thư viện benchmark (tiêu chuẩn).

require 'benchmark' 

Benchmark.bm (7) do |x| 
    x.report ("script1:") {system("./script1", "argX")} 
end 

Điều đó sẽ tạo báo cáo với người dùng và thời gian hệ thống, có thể là những gì bạn muốn.

+0

Nếu tôi không nhầm lẫn khi sử dụng thư viện điểm chuẩn theo cách này sẽ vẫn bao gồm thời gian để lệnh hệ thống được chạy. – nan

3

Bạn có thể sử dụng time và phân tích các kết quả

require 'open3' 

command = './script1 argX' 

stdout,stderr,status = Open3.capture3("time #{command}") 

results = {} 
stderr.split("\n").each do |line| 
    unless line.blank? 
    result_type,result = line.split("\t") 
    results[result_type] = result 
    end 
end 
puts "Clock time was #{results['real']}" 

time xuất ra một định dạng như

real 0m0.003s 
user 0m0.001s 
sys 0m0.002s 

Và nó ra nó vào sai số chuẩn, đó là lý do tại sao chúng ta cần phải sử dụng Open3 để có được nó (và phân biệt nó với đầu ra của tập lệnh của bạn, mà hy vọng sẽ không đụng độ với đầu ra của time).

Lưu ý rằng thời gian có đầu ra "được định dạng" trong thời gian trôi qua, vì vậy bạn có thể cần thực hiện một số phân tích cú pháp để chuyển định dạng này thành định dạng mili giây nguyên.

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