14

$$$ を支払わなければならない商用プロファイラーの 1 つを使用するのではなく、オープン ソースのプロファイラーを見つけようとしています。SourceForge で検索を行ったところ、非常に有望だと思われる次の 4 つの C++ プロファイラーを見つけました。

  1. Shiny: C++ プロファイラー
  2. 低脂肪プロファイラー
  3. ルーク・スタックウォーカー
  4. フリープロファイラー

プログラムのパフォーマンスを知るために、どのプロファイラーを使用するのが最適かわかりません。いくつかの提案を聞くのは素晴らしいことです。

4

6 に答える 6

6

Windows Performance Toolkitを試すことができます。完全に無料で使用できます。このブログ エントリ には、サンプル ベースのプロファイリングを行う方法の例があります。

于 2009-05-13T21:53:20.673 に答える
5
于 2009-05-13T23:48:55.307 に答える
3

それを行う方法は複数あります。

プロファイラーなしの方法を忘れないでください。

ほとんどのプロファイラーは、1) タイミングの高い統計精度 (大量のサンプル)、および 2) 問題識別の低い精度 (関数とコールグラフ) が必要であると想定しています。

これらの優先順位は逆にすることができます。つまり、問題は正確なマシン アドレスに配置できますが、コスト精度はサンプル数の関数です。

ほとんどの実際の問題は、高精度が必須ではない場合、少なくとも 10% のコストがかかります。

例: 何かが原因でプログラムの実行時間が 2 倍になっている場合、それはその中に 50% のコストがかかるコードが含まれていることを意味します。コール スタックが遅いときに 10 サンプルを取得すると、そのうちの約 5 行に正確なコード行が表示されます。プログラムが大きいほど、スタックのどこかで関数呼び出しが問題になる可能性が高くなります。

それは直感に反する、私は知っています。

注: xPerf はほぼ実装されていますが、完全には実装されていません (私が知る限り)。コール スタックのサンプルを取得して保存します。これは良いことです。必要だと思うものは次のとおりです。

  • 必要なときにのみサンプルを取得する必要があります。そのままでは、無関係なものを除外する必要があります。

  • スタック ビューでは、関数全体だけでなく、呼び出しが行われる特定の行またはアドレスを表示する必要があります。(たぶん、これができるかもしれません。ブログからはわかりませんでした。)

  • クリックして単一の呼び出し命令またはリーフ命令を中心としたバタフライ ビューを取得すると、CPU の割合ではなく、その命令を含むスタック サンプルの割合が表示されます。それは、時間の割合として、その命令のコストの直接的な尺度になります。(おそらくこれができるのか、私にはわかりませんでした。) したがって、たとえば、命令がファイル オープンの呼び出しや、スレッドをアイドル状態にする何かの呼び出しであったとしても、それでも実時間はかかります。それ。

注: 私はちょうど Luke Stackwalker に目を通しましたが、同じ意見が当てはまります。正しい軌道に乗っていると思いますが、UI の作業が必要です。

追加: LukeStackwalker をより注意深く調べたところ、関数を測定することはステートメントを見つけることよりも重要であるという仮定の犠牲になっているのではないかと思います。したがって、コール スタックのサンプルごとに、関数レベルのタイミング情報が更新されますが、行番号情報で行うことは、各関数の最小および最大行番号を追跡することだけです。それらがさらに離れます。したがって、基本的に最も重要な情報である行番号情報が破棄されます。重要な理由は、関数を最適化することを決定した場合、その中のどの行が作業を必要とするか、およびそれらの行が (破棄される前に) スタック サンプルにあったかを知る必要があるからです。

行番号情報が保持されていると、ストレージがすぐに不足してしまうのではないかと反対する人もいるかもしれません。2つの答え。1) サンプルに表示される線は非常に多く、繰り返し表示されます。2) それほど多くのサンプルは必要ありません - 高い統計精度の測定が必要であるという仮定は常に仮定されてきましたが、正当化されることはありませんでした。

xPerf などの他のスタック サンプラーにも同様の問題があると思われます。

于 2009-05-15T19:42:49.047 に答える
2

リストに挙げた人たちから、Luke Stackwalker が最もよく機能することがわかりました。その GUI が気に入り、簡単に実行できました。

他の同様のものはVery Sleepyです- 同様の機能、サンプリングはより信頼できるように見えます、GUI はおそらく少し使いにくいです (それほどグラフィカルではありません)。


彼らともう少し時間を過ごした後、私は1つの非常に重要な欠点を発見しました. どちらも 1 ミリ秒の解像度でサンプリングしようとしますが、実際には、サンプリング方法 (添付プロセスの StackWalk64) が遅すぎるため、達成できません。私のアプリケーションでは、コールスタックを取得するのに 5 ~ 20 ミリ秒ほどかかります。これにより、結果が不正確になるだけでなく、結果が歪められます。短い呼び出しスタックはより速く処理されるため、より多くのヒットが得られる傾向があります。

于 2009-07-16T12:13:18.313 に答える
2

オープン ソースではありませんが、AMD CodeAnalystは無料です。名前にかかわらず、Intel CPU でも動作します。Windows (Visual Studio 統合) と Linux の両方で使用できるバージョンがあります。

于 2009-05-15T21:03:46.437 に答える