あまりにも頻繁に、いくつかの新しいフレームワークとその「ベンチマーク」に関するステートメントを読みます。私の質問は一般的なものですが、次の特定の点についてです。
パフォーマンスを測定するためにコードを効果的に計測するには、開発者はどのようなアプローチを取る必要がありますか?
ベンチマークとパフォーマンステストについて読むとき、実際の結果を表していない可能性があることに注意すべきいくつかの危険信号は何ですか?
あまりにも頻繁に、いくつかの新しいフレームワークとその「ベンチマーク」に関するステートメントを読みます。私の質問は一般的なものですが、次の特定の点についてです。
パフォーマンスを測定するためにコードを効果的に計測するには、開発者はどのようなアプローチを取る必要がありますか?
ベンチマークとパフォーマンステストについて読むとき、実際の結果を表していない可能性があることに注意すべきいくつかの危険信号は何ですか?
パフォーマンスを測定するには、コードインストルメンテーションを使用する方法とサンプリングを使用する方法の2つがあります。
私が過去に使用した商用プロファイラー(Hi-Prof、Rational Quantify、AQTime)は、コードインストルメンテーションを使用し(一部はサンプリングも使用できます)、私の経験では、これにより最良で最も詳細な結果が得られます。特にRationalQuantityを使用すると、結果を拡大したり、サブツリーに焦点を合わせたり、完全な呼び出しツリーを削除して改善をシミュレートしたりできます...
これらのインストルメンテーションプロファイラーの欠点は、次のことです。
インストルメンテーションは、メモリ割り当て、クリティカルセクションなどの低レベル関数について報告される時間を歪めることもあります...
私が使用している無料のプロファイラー(Very Sleepy、Luke Stackwalker)はサンプリングを使用しています。つまり、迅速なパフォーマンステストを実行して、問題がどこにあるかを確認する方がはるかに簡単です。これらの無料のプロファイラーは、商用プロファイラーの完全な機能を備えていません(ただし、Very Sleepyの「サブツリーに焦点を当てる」機能を自分で提出しました)が、高速であるため、非常に便利です。
現時点では、私の個人的なお気に入りはVery Sleepyで、LukeStackWalkerが2番目に来ています。
どちらの場合(計装とサンプリング)でも、私の経験は次のとおりです。
それはあなたが何をしようとしているのかによります。
1)一般的なタイミング情報を維持したい場合は、リグレッションに注意を払うことができます。さまざまなインストルメンテーションプロファイラーが最適です。CPU時間だけでなく、あらゆる種類の時間を測定するようにしてください。
2)ソフトウェアを高速化する方法を見つけたい場合、それは明らかに異なる問題です。メジャーではなく、検索
に
重点を置く必要があります。
このためには、プログラムカウンターだけでなく、(必要に応じて複数のスレッドにわたって)コールスタックをサンプリングするものが必要です。それはgprofのようなプロファイラーを除外します。
重要なのは、 CPU時間ではなく、実時間でサンプリングする必要があることです。これは、I / Oが原因で、クランチが原因で時間を失う可能性が非常に高いためです。これにより、一部のプロファイラーが除外されます。
ユーザーの入力を待たない場合など、気になる場合にのみサンプルを取得できる必要があります。これにより、一部のプロファイラーも除外されます。
最後に、そして非常に重要なのは、あなたが得る要約です。行ごとの時間の割合を取得することが不可欠です。ラインによって使用される時間のパーセントは、ラインを含むスタックサンプルのパーセントです。コールグラフを使用する場合でも、関数のみのタイミングに妥協しないでください。これにより、さらに多くのプロファイラーが除外されます。(「自己時間」を忘れ、呼び出し回数を忘れてください。これらはほとんど役に立たず、誤解を招くことがよくあります。)
問題を見つける正確さはあなたが求めているものであり、それらを測定する正確さではありません。それは非常に重要なポイントです。(害はありませんが、大量のサンプルは必要ありません。害は頭の中にあり、何をしているのかではなく、測定することを考えさせられます。)
このための優れたツールの1つは、RotateRightのズームプロファイラーです。個人的に私は手動サンプリングに依存しています。