2016-05-01 12 views
2

私は最近Goを学び始めました。私は複数のgroutによって同時に使用できるマップを実装しようとしています。私はシンプルsync.Mutexで保護されたマップに私の実装を比較できるようにしたい、またはこのようなものに:https://github.com/streamrail/concurrent-map/blob/master/concurrent_map.goDo not do testing.Bベンチマークは不要な最適化を防止しますか?

Googleのキャリパーを使用してから、私はベンチマーキングのための単純なアプローチは、多くの不要な最適化が実際にゴミ箱にできるようになることを前提としてい結果。 testing.Bを使用するベンチマークでは、(GoとCaliperの両方がGoogleのプロジェクトの後に)それを避けるためにいくつかの手法を採用していますか?はいの場合、それらは知られていますか?そうでない場合は、Goでマイクロベンチマークする最良の方法は何ですか?

+2

これはあなたが探しているものかどうかわかりません。この[link](http://dave.cheney.net/2013/06/30/how-to-write-benchmarks-in-go)から「コンパイラの最適化に関する注意事項」のセクションを読んでください –

+0

@JohnSPerayil、それはまさにそうです私が探しているもの!私はそれが網羅的かどうか(私はそれがないと仮定します)、そしてそれがまだ有効かどうか(私にはわかりません)どうか疑問に思います。 – Elsinor

+0

これはおそらく有効ですが、網羅的ではありません。 –

答えて

2

私のコメントを回答に変換します。

任意のベンチマークは コンパイラの最適化、テスト中の機能を排除し、 が人為的にベンチマークの実行時間を下げることを避けるために注意する必要があり、完全に正確です。

var result int 

func BenchmarkFibComplete(b *testing.B) { 
     var r int 
     for n := 0; n < b.N; n++ { 
       // always record the result of Fib to prevent 
       // the compiler eliminating the function call. 
       r = Fib(10) 
     } 
     // always store the result to a package level variable 
     // so the compiler cannot eliminate the Benchmark itself. 
     result = r 
} 

Source

次のページにも役立ちます。

Compiler And Runtime Optimizations

もう一つの興味深い読み取りが

もう一つの興味深いフラグであり、コンパイラに最適化 パスを無効にします-N、です。

Source1Source2

私は100%確実ではないんだけど、次は最適化を無効にする必要がありますか?より多くの経験を持つ人はそれを確認する必要があります。

go test -gcflags=-N -bench=. 
2

ホットスポットコンパイラの仕組みにより、Javaでは、マイクロベンチマークが難しくなります。単純に同じコードを何度も繰り返し実行すれば、平均速度が遅くなることがよくあります。これを補うために、Caliperはウォームアップを実行し、安定したベンチマークを得るためのトリックを実行する必要があります。

Goでは、物事は静的にコンパイルされます。システムのようなランタイムホットスポットはありません。良いタイミングを得るためには、実際には何のトリックも必要ありません。

testing.Bの機能はコードのパフォーマンスに影響しないはずなので、特別な操作は必要ありません。

+0

John S Perayilが私の答えにコメントしたところでは、少なくともいくつかの最適化は、「testing.B」ベンチマークのために手作業で行う必要があることが示されていますが、奨励されています。リンクは2年以上経っているので、今のところ変わったかもしれません。 – Elsinor

2

@David Budworthは多くの優れた情報を提供しますが、Go vs Javaについては同意しますが、マイクロベンチマーキングで考慮する必要があることはたくさんあります。それらのほとんどは、「あなたのユースケースにどれくらい密接に対応していますか?たとえば、異なる並行性パターンは、競合の下で非常に異なって実行されます。複数のライターが共通すると思いますか?単一の作家、多くの読者?多くの読者、まれな文章?シングルアクセス?異なるプロデューサー/消費者が地図のさまざまな部分にアクセスしていますか?あなたのベンチマークで美しく実行するスキームは、他のユースケースではゴミかもしれません。

同様に、自分のスキームが参照の地域にあまり依存していないことがわかります。同じ値が何度も何度も何度も読み込まれている場合(CPU上のキャッシュに保持されるため)、いくつかのアプローチは非常に異なった動作をします。これはマイクロベンチマークでは非常に一般的ですが、意図したユースケースを示すものではありません。

これは、マイクロベンチマークが無用であることを意味するのではなく、たいていは役に立たない:D ...少なくとも一般的な結論に達するために。特定のプロジェクト用にこれを構築する場合は、ユースケースに合った現実的なデータとパターンをテストしていることを確認してください(理想的には、これをプログラムの実際のベンチマークに変えるだけです)。データ構造)。一般的な目的でこれを構築する場合は、幅広いユースケースに対してベンチマークを行ってから、それが実質的に優れているかどうかについて多くの結論に至る必要があります。

それはちょうど教育、素晴らしい場合。さまざまな状況で特定のスキームがうまく機能するか悪いのかを学ぶことは素晴らしい経験です。あなたの所見をあなたの証拠に追いつかせないでください。

+0

ありがとう、それは非常に素晴らしい記事ですが、私はそれに事実上すべてのことに同意しますが、私はそれが私の質問に答えるとは思わない:) – Elsinor

+0

Goで最良のマイクロベンチマークの根本的な質問に、あなたのユースケースにマッチするテストで実際のデータを使用します。 "唯一の質問が「Javaのようなホットスポットの最適化の歪みを避ける方法」である場合は、Davidの答え(正確に正しい)を参照してください。 Goには何もないので、問題はありません。ジョンのリンク(そこからのリンク)も優れていて、おそらくあなたの質問にスポットが当てられています。 –

関連する問題