3

与えられた C++ プログラムがどのように機能し、どこで最も多くの時間を費やしているかを理解したいと考えています。

そのために、最初に使用してから写真を取得しようとしましgprofgprof2dotが、結果は時々醜いです.

普段はこれをどのようにしていますか?より良い代替案をお勧めできますか?

PD オープン ソース ソリューションはどれですか (できれば Linux または Mac OS 向け)X?

4

6 に答える 6

1

Linux の OProfile はかなりうまく機能します。実際、GProf よりも気に入っています。OProfile の出力を視覚化するのに役立つグラフィカル ツールがいくつかあります。

于 2010-03-16T23:17:53.340 に答える
0

SDC++プロファイラーを参照してください。

ここでの他の回答は、プローブ指向のプロファイラーには高いオーバーヘッド(10倍)があることを示唆しています。これはしません。

于 2010-03-13T17:49:14.903 に答える
0

---と同じ答え

編集:@Steveは、私がより簡潔な答えを出すことを提案しました。

「自分のプログラムがどこで時間を費やしているかを知りたい」という言葉をよく耳にします。別の言い回しを提案させてください - 「私のプログラムが時間を費やしている理由
を知りたい」.

たぶん、違いは明らかではありません。プログラムが命令を実行すると、その理由コールスタックを含むプログラムの状態全体にエンコードされます。
プログラム カウンターだけを見るのは、車輪の回転角度をプロファイリングして、タクシーに乗る必要があるかどうかを判断しようとするようなものです。
プログラム全体の状態を見る必要があります。

私がよく耳にする別の神話があります。「遅い」メソッドを見つけるには、メソッドの実行時間を測定する必要があるというものです。プログラムが必要以上に時間がかかる方法はたくさんあります。たとえば、何らかの方法でバイナリ検索の代わりに線形検索を実行することによって、人々が念頭に置いているようなものかもしれません。

それを考える方法は次のとおりです。

  • 必要以上に時間がかかるものは一つではありません。おそらくいくつかあります。
  • 時間がかかるものはそれぞれ、10%、50%、90%、またはそのような数のように、何らかの割合を占めています。つまり、その間に壁掛け時計を止めることができれば、アプリ全体の所要時間をどれだけ短縮できるかということです。
  • それらが何であれ、それらが何であるかを知りたいのです。プロファイラー (サンプラー) は、多数の浅いサンプル (PC または呼び出しスタック) を取得し、それらを要約して測定値を取得することによって機能します。しかし、測定はあなたが必要とするものではありません。必要なのは、時間の観点から、それがをしているかを見つけることです。10 や 20 などの少数のサンプルを取得して、それらを調べる(要約しない) 方がよいでしょう。あるアクティビティに 20%、50%、または 90% の時間がかかる場合、それが各サンプルの行為でそれを検出する確率であり、それはおおよそ、それが見られるサンプルの割合です。重要なことは、無関係なものを正確に測定するのではなく、それが何であるかを見つけることです。

プログラムが何を行っているかを時間の観点から見る方法として、何人の人がそれを行っているかを以下に示します。

于 2010-03-13T19:12:52.847 に答える
0

私の意見では、2 つの選択肢があります (Windows の場合):

  • アプリケーションのアセンブリ命令を変更し (インストルメント化と呼ばれます)、すべての詳細を記録するプロファイラー。これらのプロファイラーは遅くなる傾向があり (アプリケーションの実行速度は約 10 倍遅くなります)、セットアップが難しい場合があり、多くの場合無料ではありませんが、最高のパフォーマンス関連情報を提供します。このタイプのプロファイラーが必要な場合は、「Ration Quantity」、「AQTime」、「Performance Validator」を探してください。
  • アプリケーションを計測せず、実行中のアプリケーションを見て、その「サンプル」を収集するだけのプロファイラー。これらのプロファイラーは高速で (パフォーマンスの低下はありません)、多くの場合セットアップが簡単で、無料の代替手段がかなりあります。このタイプのプロファイラーが必要な場合は、「Very Sleepy」と「Luke Stackwalker」を探してください。

過去に Rational Quantity や AQTime などの商用プロファイラーを使用し、結果に非常に満足していましたが、欠点 (セットアップが難しい、原因不明のクラッシュ、パフォーマンスの低下) が利点を上回っていることがわかりました。

したがって、私は無料の代替手段に切り替え、現時点では主に「非常に眠い」を使用しています.

于 2010-03-13T17:55:01.510 に答える
0

アプリケーションの構造 (誰が何を呼び出すか、参照するか、ツリーを呼び出すかなど) を見たい場合は、「Understand for C/C++」を参照してください。このアプリケーションは、ソース コードを調査し、アプリケーションの構造からほぼすべてを照会できるようにします。

于 2010-03-13T17:56:25.623 に答える
0

KCachegrindを試すことができます。CallgrindというValgrindツールで取得したサンプルを可視化するプログラムです。KCachegrind は積極的にメンテナンスされていないように見えるかもしれませんが、彼が生成するグラフは非常に便利です。

于 2010-03-13T18:19:28.917 に答える