2016-05-01 14 views
0

を印刷しない:私はこれを実行すると実行ベンチマークなく、次のように私はベンチマークを持っている結果に

benchmark_result = Benchmark.bm do |x| 
    x.report { send(test_name) } 
end 

、私は見ている出力を二つの場所から:中

  1. send(test_name)reportブロック。私はこの出力を見続けたいと思います。
  2. Benchmarkブロックからの出力、つまり結果として得られるベンチマークレポートがコンソールに出力されます。私はこれが起こることを望んでいない。

私はhereからコンソール出力を一時的に隠す方法を見てきました。しかし、問題は、内側のブロックに出力を続けさせたいということです。私はちょうどベンチマークの結果を見たくない。

+2

ベンチマーク結果を表示していますが、メソッド呼び出しからの出力を見たいですか?私はあなたが何かをベンチマークして、結果を投げ捨てる理由は分かりません。 – tadman

+0

メソッドのベンチマークを要求するときに、メソッドを再度実行する必要がないように、私は 'ベンチマークキャッシング'システムを作成しています。これは具体的には長時間実行されるメソッドのためであり、結果は完全に正確ではないことを認識しています。人々は私の最近の投稿された質問[ここ](http://stackoverflow.com/questions/36961017/how-to-multiply-a-benchmark?noredirect=1#comment61480374_36961017)でこれを何度も教えてくれました。基本的には、テストケースを実行するたびに、後で表示されるベンチマークを保存しています。 –

+0

興味深いプロジェクトです、説明してくれてありがとうございます。私は結果をキャプチャして、後で使用するために何らかの方法で保存できるAmitAのアプローチが最良だと思います。実際にこれらをSQLiteのような小さなデータベースに入れて、必要に応じて整理することができます。 – tadman

答えて

3

ブロックに送信されたBenchmark::ReportオブジェクトのreportメソッドをBenchmark.bmまたはBenchmark.benchmarkと呼び出すと、STDOUTに出力されます。レポートを印刷することなく、ベンチマークメトリクスでちょうど興味があるなら、あなたはこれを行うことができます:あなただけ興味があるなら

=> #<Benchmark::Tms:0x007fb5b1b40118 
@cstime=0.0, 
@cutime=0.0, 
@label="", 
@real=4.5693013817071915e-05, 
@stime=0.0, 
@total=0.0, 
@utime=0.0> 

benchmark_result = Benchmark.measure do 
    send(test_name) 
end 

をそれはこのようになりますBenchmark::Tmsオブジェクトを返します。あなたのブロックを実行するために使用した経過をリアルタイムで、(Floatを返します)次のようにします。それは標準的なようですので

benchmark_result = Benchmark.realtime do 
    send(test_name) 
end 
+0

私は 'ベンチマーク 'を何度も使ったことがありますが、実際には[doc](http://ruby-doc.org/stdlib-2.3.0/libdoc/benchmark/rdoc/Benchmark.html)を読むことはありません。悪くないアイデア。 –

0

私はアミットの答えを受け入れてきました、その間にそれを行う別の方法を考え出しました。

silence_output 
benchmark_result = Benchmark.bm do |x| 
    x.report do 
    enable_output 
    send(test_name) 
    silence_output 
    end 
end 
enable_output 
:私は、以下の使用して私の目標を達成することができ、これにより

def silence_output 
    # Store the original stderr and stdout in order to restore them later 
    @original_stderr = $stderr 
    @original_stdout = $stdout 

    # Redirect stderr and stdout 
    `touch null.txt` 
    $stderr = File.new(File.join(File.dirname(__FILE__), 'null.txt'), 'w') 
    $stdout = File.new(File.join(File.dirname(__FILE__), 'null.txt'), 'w') 
end 

# Replace stderr and stdout so anything else is output correctly 
def enable_output 
    $stderr = @original_stderr 
    $stdout = @original_stdout 
    @original_stderr = nil 
    @original_stdout = nil 
    `rm null.txt` 
end 

私は、次のコードを追加した this questionから

は(少しnull.txtファイルにtouch/rmの呼び出しを含むように修正します)

これを行うより良い方法を見た後、これは非常にハッキリのようです。

関連する問題