使用Ruby Benchmark时防止输出

时间:2016-12-28 21:19:28

标签: ruby

我正在尝试将Rake包含的touch方法与系统触摸进行比较。

每个操作都将输出发送到stdout:

require 'benchmark'
require 'rake'

n = 3
result = Benchmark.bm do |x|
  x.report("sh:") do
    n.times { sh "touch foo.txt" }
  end
  x.report("touch:") do
    n.times { touch "bar.txt" }
  end
end

结果:

user     system      total        real
sh:touch foo.txt
touch foo.txt
touch foo.txt
  0.000000   0.010000   0.030000 (  0.024775)
touch:touch bar.txt
touch bar.txt
touch bar.txt
  0.000000   0.000000   0.000000 (  0.000412)

我想要的是:

user     system      total        real
sh:touch foo.txt
  0.000000   0.010000   0.030000 (  0.024775)
touch:touch bar.txt
  0.000000   0.000000   0.000000 (  0.000412)

或其他只有结果的东西。

我在another question中读到使用Benchmark.measure,但以下内容也不起作用:

require 'benchmark'
require 'rake'

n = 3
result = Benchmark.measure do 
  n.times { sh "touch foo.txt" }
end

puts result

结果:

touch foo.txt
touch foo.txt
touch foo.txt
  0.000000   0.000000   0.010000 (  0.022931)

如何对shtouch进行基准测试,但阻止输出转到stdout?

2 个答案:

答案 0 :(得分:3)

查看the source of sh它似乎接受verbose作为选项,因此适合您的调用应该是:

sh "touch foo.txt", verbose: false

相同的can be said of touch

touch "bar.txt", verbose: false

似乎文档根本没有提到这些选项。

答案 1 :(得分:0)

您可以重定向$stdout

参见此示例

puts 1
original_stdout = $stdout
$stdout = open("/dev/null", "w")
puts 2
$stdout = original_stdout
puts 3

打印

1
3

但不打印2