与えられた C++ プログラムがどのように機能し、どこで最も多くの時間を費やしているかを理解したいと考えています。
そのために、最初に使用してから写真を取得しようとしましgprof
たgprof2dot
が、結果は時々醜いです.
普段はこれをどのようにしていますか?より良い代替案をお勧めできますか?
PD オープン ソース ソリューションはどれですか (できれば Linux または Mac OS 向け)X?
与えられた C++ プログラムがどのように機能し、どこで最も多くの時間を費やしているかを理解したいと考えています。
そのために、最初に使用してから写真を取得しようとしましgprof
たgprof2dot
が、結果は時々醜いです.
普段はこれをどのようにしていますか?より良い代替案をお勧めできますか?
PD オープン ソース ソリューションはどれですか (できれば Linux または Mac OS 向け)X?
Linux の OProfile はかなりうまく機能します。実際、GProf よりも気に入っています。OProfile の出力を視覚化するのに役立つグラフィカル ツールがいくつかあります。
SDC++プロファイラーを参照してください。
ここでの他の回答は、プローブ指向のプロファイラーには高いオーバーヘッド(10倍)があることを示唆しています。これはしません。
編集:@Steveは、私がより簡潔な答えを出すことを提案しました。
「自分のプログラムがどこで時間を費やしているかを知りたい」という言葉をよく耳にします。別の言い回しを提案させてください - 「私のプログラムが時間を費やしている理由
を知りたい」.
たぶん、違いは明らかではありません。プログラムが命令を実行すると、その理由がコールスタックを含むプログラムの状態全体にエンコードされます。
プログラム カウンターだけを見るのは、車輪の回転角度をプロファイリングして、タクシーに乗る必要があるかどうかを判断しようとするようなものです。
プログラム全体の状態を見る必要があります。
私がよく耳にする別の神話があります。「遅い」メソッドを見つけるには、メソッドの実行時間を測定する必要があるというものです。プログラムが必要以上に時間がかかる方法はたくさんあります。たとえば、何らかの方法でバイナリ検索の代わりに線形検索を実行することによって、人々が念頭に置いているようなものかもしれません。
それを考える方法は次のとおりです。
プログラムが何を行っているかを時間の観点から見る方法として、何人の人がそれを行っているかを以下に示します。
私の意見では、2 つの選択肢があります (Windows の場合):
過去に Rational Quantity や AQTime などの商用プロファイラーを使用し、結果に非常に満足していましたが、欠点 (セットアップが難しい、原因不明のクラッシュ、パフォーマンスの低下) が利点を上回っていることがわかりました。
したがって、私は無料の代替手段に切り替え、現時点では主に「非常に眠い」を使用しています.
アプリケーションの構造 (誰が何を呼び出すか、参照するか、ツリーを呼び出すかなど) を見たい場合は、「Understand for C/C++」を参照してください。このアプリケーションは、ソース コードを調査し、アプリケーションの構造からほぼすべてを照会できるようにします。
KCachegrindを試すことができます。CallgrindというValgrindツールで取得したサンプルを可視化するプログラムです。KCachegrind は積極的にメンテナンスされていないように見えるかもしれませんが、彼が生成するグラフは非常に便利です。