2011-01-04 13 views
11

Ich schreibe ein Ruby 1.9.2 Skript zur Auswertung der Ausführungszeiten der verschiedenen externen Kommandozeilenaufrufe.messen Ausführungszeit von Kommandozeilenaufrufen

verwendete ich den Rubin Process.system Verfahren die Befehlszeile Anrufe ausführen und versucht, die Ausführung von Zeit zu erfassen, wie folgt:

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

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

Jetzt habe ich das Problem, dass die Dauer nicht die Ausführungszeit widerspiegelt des externen Prozesses aber die Ausführungszeit des "System" -Aufrufs.

Irgendeine Idee, wie ich die Ausführungszeit des externen Prozesses messen kann?

Antwort

2

Wenn ich richtig verstanden habe, möchten Sie den Ruby-Prozess zeitlich festlegen, der Ihr Skript ausführt. Wenn Sie an einem * nix-System arbeiten, können Sie das Dienstprogramm time verwenden. Sie können dann Folgendes tun: time ruby *yourscript*

+0

funktioniert auch auf Mac läuft rvm –

+0

macs sind * nix systems haha ​​ – Jay

12

Okay. Wenn ich verstehe, was Sie versuchen zu tun, möchten Sie Zeit, wie lange der "./script1" Anruf dauert zu laufen?

Eine Sache, die Sie vielleicht tun möchten, ist die Verwendung der benchmark-Bibliothek (es ist Standard).

Das wird einen Bericht mit Benutzer- und Systemzeiten generieren, die das sein können, was Sie möchten.

+0

Wenn ich nicht falsch bin mit der Benchmark-Bibliothek auf diese Weise wird immer noch die Zeit für den Systembefehl ausgeführt werden. – nan

3

können Sie time verwenden und analysieren die Ergebnisse

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 gibt ein Format wie

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

Und es gibt sie an den den Standardfehler, weshalb wir verwenden müssen Open3, um es zu bekommen (und es von der Ausgabe Ihres Skripts zu unterscheiden, die hoffentlich nicht mit der Ausgabe time kollidiert).

Beachten Sie, dass die Zeit für die verstrichene Zeit eine "formatierte" Ausgabe hat. Daher müssen Sie möglicherweise ein Parsing durchführen, um dies in ein raw Millisekundenformat zu bringen.

Verwandte Themen