Измерение времени выполнения вызовов в командной строке

Я пишу Ruby 1.9.2 script для оценки времени выполнения различных внешних вызовов командной строки.

Я использовал метод ruby ​​Process.system для выполнения вызовов в командной строке и попытался записать время выполнения следующим образом:

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

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

Теперь у меня есть проблема, что продолжительность не отражает время выполнения внешнего процесса, а время выполнения "системного" вызова.

Любая идея, как я могу измерить время выполнения внешнего процесса?

Ответ 1

Хорошо. Если я понимаю, что вы пытаетесь сделать, вы хотите узнать, как долго длится вызов "./script1"?

Одна вещь, которую вы, возможно, захотите сделать, это использовать библиотеку benchmark (она стандартная).

require 'benchmark'

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

Это приведет к созданию отчета с пользовательскими и системными временами, которые могут быть тем, что вы хотите.

Ответ 2

Вы можете использовать time и проанализировать результаты

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 выводит формат, например

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

И он выводит его на стандартную ошибку, поэтому нам нужно использовать Open3 для его получения (и отличать его от вывода вашего script, который, надеюсь, не будет сталкиваться с выходом time),.

Обратите внимание, что время имеет "отформатированный" вывод для прошедшего времени, поэтому вам может понадобиться выполнить синтаксический анализ, чтобы получить это в формате необработанных миллисекунд.

Ответ 3

Если я правильно понял, вы хотите, чтобы Ruby-процесс выполнял ваш script. Когда вы работаете в системе * nix, вы можете использовать утилиту time. Затем вы можете сделать следующее: time ruby *yourscript*