Сохранение результатов теста ruby ​​в файл

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

Benchmark.bm(" "*7 + CAPTION, 7, FMTSTR, ">avg:") do |bench|
  #this loops over a  couple of runs
  bench.report("Run #{run}: ") do
    begin
    Timeout::timeout(time) {
      res = `#{command}`
    }
    rescue Timeout::Error
    end
  end
end

Использование тайм-аута, вероятно, немного грубое, но должно быть в порядке для моих нужд. Проблема в том, что Benchmark.bm просто печатает результаты тестов. Я хотел бы иметь возможность сохранять их в файл для дальнейшей обработки (он запускается пару раз в одном скрипте, поэтому я не хочу просто потреблять вывод терминала - кажется, слишком много усилий для чего-то такого простого)


person mck    schedule 07.03.2013    source источник
comment
Похоже, самым простым способом было бы проверить исходный код библиотеки и сделать что-то самому. :( Они используют STDOUT в нескольких местах.   -  person reto    schedule 07.03.2013


Ответы (1)


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

$stdout = File.new('benchmark.log', 'w')
$stdout.sync = true

И все перенаправляется в файл, конечно, если вам нужен какой-то вывод в консоль, вам придется остановить перенаправление, как это.

$stdout = STDOUT

РЕДАКТИРОВАТЬ: вот сценарий, который я использовал для проверки этого

require 'benchmark' 

$stdout = File.new('console.out', 'w')
$stdout.sync = true

array = (1..100000).to_a 
hash = Hash[*array]

Benchmark.bm(15) do |x| 
  x.report("Array.include?") { 1000.times { array.include?(50000) } } 
  x.report("Hash.include?")  { 1000.times { hash.include?(50000) } } 
end 
person peter    schedule 07.03.2013
comment
Я попробовал это пару минут назад, и, к сожалению, это не работает. Я получаю следующую ошибку: benchmark.rb:207:in '*': can't convert String into Integer (TypeError). Я думаю, что это связано с комментарием рето под моим вопросом. - person mck; 07.03.2013
comment
Я попробовал это на своем компьютере, и это сработало, я опубликую тестовый скрипт, который я использовал, я использую Windows 7 и Ruby 1.9.3. - person peter; 07.03.2013
comment
Я использую рубин 1.8.7. попробую обновить. Спасибо! - person mck; 07.03.2013
comment
Мац только что объявил о выпуске 2.0, что 1.8 скоро умрет, так что вам лучше это сделать, успехов! - person peter; 07.03.2013
comment
Так что да, это правильно. Большое вам спасибо за вашу помощь. Я изменил вызов, который я делал для запуска теста при изменении $stdout, и это сломало ситуацию. Я не осознавал, что сделал это. Спасибо еще раз! - person mck; 08.03.2013