Измерение времени выполнения вызовов в командной строке
Я пишу 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*