Запазване на резултата от бенчмарка на ruby ​​във файл

Написах кратък ruby ​​скрипт, за да определя времето за изпълнение на помощна програма за командния ред, която имам. Използвам Benchmarkmodule на ruby ​​така:

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). Мисля, че това е свързано с коментара на reto под моя въпрос. - person mck; 07.03.2013
comment
Опитах го на моя компютър и работи, ще публикувам тестовия скрипт, който използвах, използвам Windows 7 и ruby ​​1.9.3 - person peter; 07.03.2013
comment
Използвам ruby ​​1.8.7. Ще се опитам да надстроя. Благодаря! - person mck; 07.03.2013
comment
Matz току-що обяви, че пуска 2.0, че 1.8 ще умре скоро, така че е по-добре да го направите, успех! - person peter; 07.03.2013
comment
Така че да, това е правилно. Благодаря ви много за вашата помощ. Промених обаждането, което правех, за да стартирам бенчмарка при промяна на $stdout и това счупи нещата. Не осъзнавах, че съм го направил. Благодаря отново! - person mck; 08.03.2013