2011-01-04 15 views
11

Estoy escribiendo un script Ruby 1.9.2 para evaluar los tiempos de ejecución de diferentes llamadas de línea de comando externas.medir el tiempo de ejecución de las llamadas de línea de comando

que utiliza el método de rubí Process.system para ejecutar las llamadas de línea de comandos y trataron de capturar el momento de ejecutar la siguiente manera:

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

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

Ahora tengo el problema de que la duración no refleja el tiempo de ejecución del proceso externo pero el tiempo de ejecución de la llamada al "sistema".

¿Alguna idea de cómo puedo medir el tiempo de ejecución del proceso externo?

Respuesta

2

Si entiendo correctamente, desea sincronizar el proceso Ruby ejecutando su script. Cuando trabaje en un sistema * nix, puede usar la utilidad time. A continuación, puede hacer lo siguiente: time ruby *yourscript*

+0

también funciona en mac running rvm –

+0

macs son * nix systems jaja – Jay

12

Bien. Si entiendo lo que estás tratando de hacer, ¿quieres medir el tiempo de duración de la llamada "./script1"?

Una cosa que podría querer hacer es usar la biblioteca benchmark (es estándar).

require 'benchmark' 

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

Eso generará un informe con los tiempos del usuario y del sistema, que pueden ser los que usted desea.

+0

Si no me equivoco al utilizar la biblioteca de referencia de esta forma, todavía se incluirá el tiempo que tarda en ejecutarse el comando del sistema. – nan

3

Puede utilizar time y analizar los resultados

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 salidas de un formato como

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

Y lo envía al el error estándar, por lo que tenemos que utilizar Open3 para obtenerlo (y diferenciarlo de la salida de su secuencia de comandos, que con suerte no entrará en conflicto con la salida de time).

Tenga en cuenta que el tiempo tiene una salida "formateada" para el tiempo transcurrido, por lo que es posible que tenga que hacer algunos análisis para obtener esto en un formato de milisegundos sin procesar.

Cuestiones relacionadas