スタックサンプリングを超えて:C ++プロファイラー


146

ハッカーの物語

日付は12/02/10です。クリスマスの前の日々がどんどんどろどろになっていて、私はWindowsプログラマーとして大部分の主要な障害にぶつかりました。私はAQTimeを使用しており、眠くて、光沢があり、非常に眠いので、VTuneをインストールしています。私はVS2008プロファイラーを使用しようとしましたが、積極的に罰せられているだけでなく、多くの場合無意味です。私はランダムな一時停止テクニックを使用しました。呼び出しツリーを調べました。関数のトレースを開始しました。しかし、悲しいことに、私が使用しているアプリは100万行を超えるコードであり、おそらく数百万行に相当するサードパーティのアプリが含まれています。

より良いツールが必要です。 私は他のトピックを読みました。 各トピックにリストされている各プロファイラーを試しました。単にこれらのジャンキーで高価なオプションよりも優れたもの、またはほとんど利益が得られない途方もない量の作業でなければなりません。問題をさらに複雑にするために、コードは大量にスレッド化され、いくつかのQtイベントループを実行します。それらのループの一部は非常に壊れやすく、タイミングの遅延が原因で重いインスツルメンテーションの下でクラッシュします。複数のイベントループを実行している理由を聞かないでください。誰にも言えません。

Windows環境でValgrindに沿ったオプションはありますか?
私がすでに試した長い壊れた道具よりも良いものはありますか?
Qtと統合するために設計されたものはありますか、おそらくキュー内のイベントの便利な表示と一緒ですか?

私が試したツールの完全なリスト、およびイタリックで本当に役立つツール:

  • AQTime:かなり良いです!深い再帰には問題がありますが、コールグラフはこれらの場合に正しく、混乱を解消するために使用できます。完璧なツールではありませんが、試してみる価値はあります。それはあなたのニーズに合うかもしれません、そしてそれは確かに私にとってほとんどの場合十分でした。
  • デバッグモードでのランダムな一時停止攻撃:十分な情報が不足しています。
    優れたツールですが、完全なソリューションではありません。
  • Parallel Studios: 核となるオプション。目障りで、奇妙で、とてつもなく強力です。30日間の評価を上げて、適切かどうかを判断する必要があります。それもすごくかっこいいです。
  • AMD Codeanalyst: 素晴らしい、使いやすく、クラッシュしやすいですが、それは環境問題だと思います。無料なので試してみることをお勧めします。
  • ルーク・スタックウォーカー:小さなプロジェクトでうまく機能します。それを私たちのプロジェクトで機能させるのは少し困難です。しかし、いくつかの良い結果があり、それは間違いなく私の個人的な仕事のためのスリーピーを置き換えます。
  • PurifyPlus: Win-x64環境はサポートされません。最も目立つのはWindows 7です。それ以外は優れています。他の部門の多くの私の同僚はそれを誓います。
  • VS2008プロファイラー:関数トレースモードで必要な解像度で100ギグ以上の範囲の出力を生成します。プラス面では、確かな結果が得られます。
  • GProf:GCCが適度に効果的であることを要求します。
  • VTune:VTuneのW7は犯罪者の国境をサポートしています。そうでなければ優れている
  • PIN:自分のツールを改造する必要があるので、これは最後の手段です。
  • Sleepy \ VerySleepy:小さいアプリに便利ですが、ここでは失敗します。
  • EasyProfiler:インストルメントする場所を示すために手動で挿入されたコードを少しでも気にしなければ問題ありません。
  • Valgrind:* nixのみですが、その環境では非常に優れています。
  • OProfile:Linuxのみ。
  • プロフィール:彼らは野生の馬を撃ちます。

私が試していない推奨ツール:

  • XPerf:
  • グローコード:
  • Devpartner:

注: 現在のところIntel環境。VS2008、ブーストライブラリ。Qt 4+。そして、それらすべての惨めなhumdinger:trolltechによるQt / MFC統合。


現在:ほぼ2週間後、私の問題は解決したようです。リストにあるほぼすべてのものや、いくつかの個人的なトリックなど、さまざまなツールのおかげで、主要なボトルネックが見つかりました。ただし、新しいプロファイラと新しい技術のテスト、調査、試行を続けます。どうして?君たちが借りているからだ、君たちがロックしているから。タイムラインが少し遅くなりますが、私は新しいツールを試し続けることに非常に興奮しています。

概要
他の多くの問題の中で、最近、多くのコンポーネントが誤ったスレッドモデルに切り替わり、その下にあるコードが突然マルチスレッドでなくなったために深刻なハングアップが発生しました。私のNDAに違反しているのでこれ以上は言えませんが、これは何気ない検査や通常のコードレビューによってさえ発見されなかったと言えるでしょう。プロファイラー、コールグラフ、ランダムな一時停止を併用しなくても、美しい空の青い円弧に怒りを叫び続けます。ありがたいことに、私は今まで会ったことのない最高のハッカーと仕事をしており、素晴らしい「素晴らしいツールと素晴らしい人々でいっぱいの詩」にアクセスできます。

ジェントルフォーク、私はこれを非常に感謝しています。そして、私があなた一人一人に報奨金を報いるほどの担当者がいないことを後悔しているだけです。これは、SOでこれまでに得たものよりも良い答えを得るための重要な質問であるとまだ思います。

その結果、次の3週間は毎週、私ができる最大の報奨金を上げて、常識ではないと思う最高のツールを使って回答にそれを与えます。3週間後、私の罰を許していただければ、プロファイラーの明確なプロファイルが蓄積されていると思います。

テイクアウト
プロファイラーを使用します。それらはリッチー、カーニハン、ベントレー、クヌースにとって十分なものです。私はあなたがあなたが誰だと思うかは気にしません。プロファイラーを使用します。あなたが持っているものが機能しない場合は、別のものを見つけてください。見つからない場合は、コーディングしてください。コードを作成できない場合や、ちょっとした電話が切れた場合、または行き詰まった場合は、ランダムな一時停止を使用してください。他のすべてが失敗した場合、プロファイラーを強打するためにいくつかの大学院生を雇います。


より長い眺め
なので、ちょっと振り返ってみればいいかなと思いました。私はParallel Studioを広範囲に使用することを選択しました。その理由の1つは、実際にはPINツールの上に構築されているためです。関係する研究者の何人かと学術的な取引があったので、これはおそらくある程度の品質の印だと感じました。ありがたいことに、私は正しかった。GUIは少し恐ろしいですが、IPSは信じられないほど便利であることがわかりました。重要なのは、行レベルのヒットカウントを取得する明確な方法がないことです。これは、AQTや他の多くのプロファイラーが提供するものであり、特にブランチ選択の割合を調べるのに非常に役立ちます。ネットでは、AQTimeの使用も楽しんでおり、彼らのサポートは非​​常に迅速であることがわかりました。繰り返しますが、私は私の推薦を修飾する必要があります:それらの機能の多くはそれほどうまく機能せず、Win7x64では一部の機能がクラッシュする傾向があります。XPerfも見事に動作しましたが、特定の種類のアプリケーションで適切な読み取りを行うために必要なサンプリングの詳細については、苦労して遅くなります。

今のところ、W7x64環境でC ++コードをプロファイリングするための決定的なオプションはないと思いますが、便利なサービスを実行できないオプションは確かにあります。


18
あなたは別の仕事を得ることを検討しましたか?:)
Nikolai Fetissov

10
パズルをこれほど一生懸命に解くために、他にどこに行くのでしょうか?カーネルハッキングに戻ることはできると思いますが、それでも利益はありません。
Jake Kurzer、

3
@Kos私は、gprofが-pgでコンパイルされたgccツールセットを使用している必要があると考えています。それ以外の場合、gprof.outファイルは生成されません。OPの場合、gprofの使用を除外するmsvcを使用しているようです。それでも、リストの他の人が彼のニーズを満たしていない場合、gprofが彼のためにこれ以上公平になるとは思いません
greatwolf

2
@Marc Gravellそれはまあまあだと思います...私には奇妙なヒューリスティックに思えます。最もよく維持されている投稿がコミュニティドメインに突然渡され、質問または回答を更新および維持する状況が効果的に発生するということですコミュニティ全体から見て、そのメンテナンスから外れることが少なくなります。これをメタに持っていくべきですか?
Jake Kurzer、

2
プロファイラーについて私が今知っていることを考えると、誰かが回顧を望んでいますか?
Jake Kurzer、2011年

回答:


65

最初:

時間サンプリングプロファイラーは、CPUサンプリングプロファイラーよりも堅牢です。私はWindows開発ツールに精通していないので、どれがどれであるかはわかりません。ほとんどのプロファイラーはCPUサンプリングです。

CPUサンプリングプロファイラーは、N命令ごとにスタックトレースを取得します。
この手法は、CPUバウンドであるコードの部分を明らかにします。それがアプリケーションのボトルネックである場合、これはすばらしいことです。アプリケーションスレッドがほとんどの時間をミューテックスとの戦いに費やしている場合、それほど素晴らしいことではありません。

時間サンプリングプロファイラーは、Nマイクロ秒ごとにスタックトレースを取得します。
この手法は、「遅い」コードにます。原因が、CPUバウンド、ブロッキングIOバウンド、ミューテックスバウンド、またはキャッシュスラッシングコードのセクションであるかどうか。要するに、これまでにコードのどの部分がアプリケーションを遅くしているのかが際立っています。

したがって、特にスレッド化されたコードをプロファイリングする場合は、可能な限り時間サンプリングプロファイラーを使用してください。

第二:

サンプリングプロファイラーは大量のデータを生成します。データは非常に有用ですが、簡単に使用するには多すぎることがよくあります。ここでは、プロファイルデータビジュアライザーが非常に役立ちます。プロファイルデータの視覚化のために見つけた最高のツールはgprof2dotです。です。名前に惑わされないでください。すべての種類のサンプリングプロファイラー出力(AQtime、Sleepy、XPerfなど)を処理します。視覚化によって問題のある機能が指摘されたら、生のプロファイルデータに戻って、実際の原因についてのヒントを取得します。

gprof2dotツールはドットグラフの説明を生成し、それをgraphvizツールにフィードします。出力は基本的に、アプリケーションへの影響によって関数が色分けされたコールグラフです。 代替テキスト

gprof2dotが素晴らしい出力を生成するためのいくつかのヒント。

  • --skewグラフで0.001の値を使用しているため、ホットコードパスを簡単に確認できます。それ以外の場合int main()がグラフを支配します。
  • C ++テンプレートでおかしなことをしているなら、おそらく追加したくなるでしょう--strip。これは特にBoostに当てはまります。
  • OProfileを使用してサンプリングデータを生成します。良い出力を得るには、サードパーティおよびシステムライブラリからデバッグシンボルをロードするように設定する必要があります。同じことを必ず行ってください。そうしないと、実際に起こっているのmallocはヒープを破壊して15%を消費しているときに、CRTがアプリケーションの時間の20%を費やしていることがわかります。

これが私の問題に対する完全な答えであることはわかりませんが、gprof2dotは私の膨大な武器になり、急速にお気に入りのスポットを想定しています。それは報奨金の価値があると思います!
Jake Kurzer、2010

2
私はこの質問をLinux時間サンプルベースのプロファイラーに質問しました。OProfileは、最終的に取得時間ベースのサンプリングであると想定されています。それらは非常に高品質な出力を生成するので、それらがその機能を追加したら、それらを使用します。それ以外に、プロファイリング用のgdb +バックトレースソリューションを一緒にハッキングする友人がいました。非常にハッキーですが、ボトルネックが見つかりました。
deft_code

@deft_code:「プロファイリング用のgdb +バックトレースソリューションを一緒にハックします。非常にハックですが、ボトルネックが見つかりました。」あなたは私の絶え間ない怒りを確認しています:)一部の人々はプロファイリングをきれいにしたいのですが、結果があなたが必要とするものであるなら、何がきれいであるかではなく、何がうまくいくかを考えてください
Mike Dunlavey、2014年

私はマイク・ダンラベイに同意します。XPerf / WPAのようなものは非常に美しく強力ですが、これらのツールの使用方法を理解するにはしばらく時間がかかります。結局、ランダムな一時停止は非常に簡単で、問題を解決するためのより良い情報を提供します。より自動化されたソリューションは、ボトルネックを解決するために必要な重要な情報を除外することが多いようです。
JDiMatteo 2014年

16

ランダムな一時停止を試みたときに何が起こりましたか?モンスターアプリでずっと使っています。あなたはそれが十分な情報を提供しないと言いました、そしてあなたはあなたがあなたに高解像度が必要であると提案しました。時々人々はそれを使う方法を理解するのに少し助けが必要です。

私がVSで行うことは、スタックの表示を構成して、関数の引数が表示されないようにすることです。

次に、待機している間に「一時停止」を押して、約10個のサンプルを取得します。参考のため、^ A、^ C、^ Vを使用してメモ帳にコピーします。それから私は一人一人を研究して、その時に達成しようとしている過程で何があったのかを理解しようとします。

それが2つ以上のサンプルで何かを達成しようとしていて、それが厳密に必要ではない場合、私はライブの問題を発見しました。

正確なパーセントは重要ではない、とあなたはについては何も行うことができないため、どのような内部のサードパーティのコードに行くことは、重要でないようにあなたが本当に、知っておく必要がないものがあり、それらは。あなたが何かできることは、あなたができるコードの豊富な呼び出しポイントのセットです各スタックサンプルに表示される変更。それはあなたの幸せな狩猟場です。

私が見つける種類の例:

  • 起動時に、DLLリソースから国際化された文字列を抽出しようとする過程で、約30層の深さになる可能性があります。実際の文字列を調べると、ユーザーが実際に目にすることのない文字列のように、文字列を国際化する必要がないことがすぐにわかります。

  • 通常の使用中に、一部のコードは無害にModifiedプロパティをいくつかのオブジェクトに設定します。そのオブジェクトは、変更をキャプチャし、データ構造全体に波及する通知をトリガーし、UIを操作し、予測が困難な方法でオブジェクトを作成および破棄するスーパークラスからのものです。これは多く発生する可能性があります-通知の予期しない結果。

  • 行ごと、セルごとにワークシートに入力します。値の配列から行を一度に作成すると、はるかに高速になります。

PSマルチスレッドの場合、一時停止すると、すべてのスレッドが一時停止します。各スレッドの呼び出しスタックを見てください。たぶん、そのうちの1つだけが本当の犯人であり、他の人はアイドリングしています。


2
コメント?コメント?これはスパルタです!私...申し訳ありませんが、それがどこから来たのかわかりません。いいえ、このコードはKlingon Operaを読みやすくし、ドキュメント化されています。実際、私はそれがはるかに文書化されていないと思います...ああ、神様。
Jake Kurzer、2010

3
QTMFC統合?すばらしいですね。複雑邪悪で、アプリケーション固有のコードにまだ慣れていません。
Ben Voigt

5
QT / MFC?それは、彼らが今までで最も愚かな考えを聞くすべての考えを呼びながら、前後に揺れる3つの頭を持つミュータントの子供を生み出すべきではないでしょうか?エラー...余談です... MFCソケットクラスのいずれかを使用している場合は、すぐにソケットコードを書き直してからプロファイルを作成してください。CSocketコードには、パフォーマンスを低下させることがわかっているWaitForSingleObjectのメッセージループバージョンを使用する場所がたくさんあります。私の人生では、待機機能の名前を思い出せません...:/
JimR

2
ああ、神よ、私を信じてください。
Jake Kurzer

3
@ジェイク:あまり快適ではありませんが、それはチューリングの普遍性の栄光です。どんな言語でも、どんなに高いまたは低いレベルでも、誤用される限りない能力において同等です。
Mike Dunlavey、2010

8

AMD CodeAnalystである程度成功しました。


現時点ではIntel環境。覚えておきましょう!:)
ジェイクカーツァー

4
@ジェイク:あなたが何を言っているのかよくわかりません。AMD CodeAnalystはAMDチップを必要としません。Intelチップを含むほとんどのx86またはx64(別名x86-64 / IA-64 / AMD64)チップで動作するはずです。
Adam Rosenfield、2010

1
どうやら、私は文盲です!それは素晴らしいニュースです。明日試して質問を更新します。
Jake Kurzer、

これまでのところ、必要な解像度でサンプリングすることは非常に不安定です。
Jake Kurzer、2010

@Adam:最近Intel pentium IVマシンでコードアナリストを試してみましたが、時間ベースのサンプリングしか提供されず、スレッドの使用に関する情報もスレッド関連の情報もまったく提供されませんでした。さらに、それはビジュアルスタジオのqt統合でクラッシュを引き起こしました。私は満足しませんでした:(
smerlin

7

MFC OnIdle関数はありますか?以前は、ほぼリアルタイムのアプリを修正しなければなりませんでした。これは、PentiumDが対応できるはずだった19.2Kの速度に設定されたときにシリアルパケットをドロップすることでした。OnIdle関数は、物事を殺すものでした。QTにその概念があるかどうかはわかりませんが、それについても確認します。


2
実際にはOnIdleがあり、QTMFC統合のおかげで、QT ev..e ... eve ...イベントループを通過しています。ああああ。
Jake Kurzer、

これが直接私たちのソリューションにつながることが判明したので、それは質問に対する完全な答えではありませんが、質問には答えられないと思います。
Jake Kurzer

4

VSプロファイラーについて-それがそのような大きなファイルを生成している場合、おそらくサンプリング間隔が頻繁すぎますか?とにかく十分なサンプルがあるので、下げてみてください。

そして理想的には、問題のある領域を実際に実行するまでサンプルを収集しないようにしてください。したがって、収集を一時停止して開始し、プログラムに「遅いアクティビティ」を実行させてから、収集を開始します。コレクションに必要なのは最大20秒だけです。この後、収集を停止します。

これは、サンプルファイルのサイズを小さくし、分析に必要なものだけをキャプチャするのに役立ちます。


これを明日撮ります。
Jake Kurzer、

4

PurifyPlus for Windows を正常に使用しました。安くはありませんが、IBMは少し不自由な試用版を提供しています。quantifyを使用したプロファイリングに必要なのは、pdbファイルと/ FIXED:NOを使用したリンクだけです。唯一の欠点:Win7 / 64のサポートなし。


残念ながら、主なターゲットはWin7です。その情報をメインの投稿に追加します。
Jake Kurzer

1
PurifyPlusの現在のバージョンはWin7 / 64をサポートしています。
hmuelner 2013年

3

Easyprofilerここで言及したことはまだ見たことがありませんので、すでに見ているかどうかはません。メトリックデータの収集方法は少し異なります。コンパイル時のプロファイルアプローチを使用する場合の欠点は、コードベースを変更する必要があることです。したがって、速度が低下する可能性のある場所をある程度把握し、そこにプロファイリングコードを挿入する必要があります。

しかし、あなたの最新のコメントを見てみると、少なくとも何らかの前進をしているように思えます。おそらく、このツールはいくつかの有用な指標を提供するかもしれません。他に何もない場合は、いくつかの本当にパディなチャートと写真があります:P


3

さらに2つのツールの提案。

Luke Stackwalkerはかわいい名前(私の好みのために少し苦労している場合でも)で、コストはかかりませんし、ソースコードも入手できます。また、マルチスレッドプログラムもサポートすると主張しています。ですから、一見の価値があります。

http://lukestackwalker.sourceforge.net/

また、使用する価値があると私が指摘してきたGlowcode:

http://www.glowcode.com/

残念ながら、私はしばらくの間PCの作業を行っていないため、これらのいずれも試していません。とにかく、提案がお役に立てば幸いです。


3

XPerfのチェックアウト

これは、MSが提供する無料の非侵襲的で拡張可能なプロファイラーです。これは、Windowsのプロファイルを作成するためにMicrosoftによって開発されました。


3

イベントループが疑わしい場合、QCoreApplication :: notify()と手動プロファイリング(送信者/イベントからカウント/時間への1つまたは2つのマップをオーバーライドできますか?

最初にイベントタイプの頻度をログに記録し、次にそれらのイベントをより注意深く調べます(どのオブジェクトがイベントを送信するか、何が含まれるかなど)。スレッド間のシグナルは暗黙的にキューに入れられるので、イベントループで終了します(明示的にキューに入れられた接続も同様です)。

イベントハンドラーで例外をトラップして報告するために行ったので、実際にはイベントがそこを通過します。

ただのアイデア。


それは素敵なアイデアです!私はQT環境に慣れていません。これまでの作業のほとんどをpyGTKで行っていました。ありがとうございました!
Jake Kurzer、

特定の信号の性質を調達および解決する推奨方法はありますか?
Jake Kurzer、

私はQStateMachine :: SignalEventを使用してシグナルに対してのみそれを行いましたが、これは同じではないようです。ソースは引き続きQObject* objectパラメーターである必要があります。たぶんMetaCallがすべての信号のタイプであるようですが(おそらくそうです)、私にはわかりません。これは私の経験を少し超えていますが、Qtソースを覗いてみると、いくつかの真実がわかるかもしれません。(または、ここでSOでキューに入れられたシグナル呼び出しについてより詳細な質問をしてください.. :)
Macke

2

編集:私は今、あなたが最初の投稿でこれを言及したのを見る。くそー、私はその人になるとは思っていませんでした。

Pinを使用して、コードをさらに細かく計測できます。Pinを使用すると、関数を入力した回数やそこに費やしたクロック数をカウントするツールを作成でき、VTuneやCodeAnalystのようなものを大まかにエミュレートできます。次に、タイミングの問題が解消されるまで、どの関数がインストルメント化されるかを削除できます。


実際、PINは私が最初にたどり着いたものでした。実際には、PIN Playと呼ばれる完璧なものがありますが、それはIntel外でのリリース用ではありません。PINを使用して本当に良いものをまとめるために十分なことを覚えているかどうかはわかりませんが、...
Jake Kurzer

2

毎日使うものを教えてあげます。

a)AMDコードアナリスト

  • それは簡単で、何が起こっているのかを素早く概観することができます。ほとんどの場合、問題ありません。
  • AMD CPUを使用すると、CPUパイプラインに関する情報が表示されますが、これが必要になるのは、グラフィックエンジンやビデオコーデックなどのように重いループがある場合のみです。

b)VTune。

  • vs2008に非常によく統合されています

  • ホットスポットがわかったら、時間だけでなく、キャッシュミスやメモリ使用量などのサンプルを収集する必要があります。これは非常に重要です。サンプリングセッションをセットアップし、プロパティを編集します。私は常に時間、メモリの読み取り/書き込み、およびキャッシュミス(3つの異なる実行)をサンプリングします

しかし、ツール以外にも、プロファイリングの経験を積む必要があります。そして、それはCPU /メモリ/ PCIがどのように機能するかを理解することを意味します...それで、これは私の3番目のオプションです

c)単体テスト

これは、大きなパフォーマンスを必要とする大きなアプリケーションを開発する場合に非常に重要です。アプリをいくつかに分割できない場合、CPUの使用状況を追跡することは困難です。すべてのケースとクラスをテストするわけではありませんが、重要な機能を備えた実行コードと入力ファイルをハードコードしています。

私のアドバイスは、いくつかの小さなテストでランダムサンプリングを使用して、プロファイル戦略を標準化することです。


AMD Code Analystは私の開発環境では不安定であり、VTuneは明示的にサポートしていません。:S
ジェイクカーツァー

2

私はすべてのプロファイリングのニーズにxperf / ETWを使用しています。学習曲線は急ですが、非常に強力です。Windowsでプロファイリングする場合は、xperfを知っている必要があります。私はこのプロファイラーを頻繁に使用して、自分のコードや他の人のコードのパフォーマンスの問題を見つけています。

私が使用する構成では:

  • xperfは、msごとにコードを実行しているすべてのコアからCPUサンプルを取得します。サンプリングレートを8 KHzに上げることができ、サンプルにはユーザーモードとカーネルコードが含まれます。これにより、実行中のスレッドの動作を確認できます。
  • xperfはすべてのコンテキストスイッチを記録し(各スレッドが使用する時間を完全に再構築できるようにします)、さらにスレッドが切り替えられたときのコールスタックと、他のスレッドを準備したスレッドのコールスタックを記録し、待機チェーンのトレースとスレッドの理由の特定を可能にします実行されていません
  • xperfはすべてのプロセスからのすべてのファイルI / Oを記録します
  • xperfはすべてのプロセスからのすべてのディスクI / Oを記録します
  • xperfは、アクティブなウィンドウ、CPU周波数、CPU電源状態、UI遅延などを記録します。
  • xperfは、1つのプロセスからのすべてのヒープ割り当て、すべてのプロセスからのすべての仮想割り当てなども記録できます。

これは、すべてのプロセスの1つのタイムラインにある大量のデータです。Windowsの他のプロファイラーはそれを行うことができません。

xperf / ETWの使用方法について広範囲にブログを書いています。これらのブログ投稿といくつかの専門的な品質のトレーニングビデオは、次の場所にあります。http//randomascii.wordpress.com/2014/08/19/etw-training-videos-available-now/

xperfを使用しない場合にどうなるかを知りたい場合は、次のブログ投稿を参照してください。http//randomascii.wordpress.com/category/investigative-reporting/ これらは、他の人のコードで見つけたパフォーマンスの問題の物語です、それは開発者によって発見されるべきでした。これには、VC ++コンパイラに読み込まれるmshtml.dll、VC ++のファイル内検索でのサービス拒否、意外な数の顧客のマシンでのサーマルスロットリング、Visual Studioでのシングルステップの低速化、ハードディスクでの4 GBの割り当てが含まれます。ディスクドライバ、パワーポイントのパフォーマンスバグなど。


1

私は、C ++用の手動でインストルメント化されたポータブルプロファイリングライブラリであるCxxProfの最初の使用可能なバージョンを完成させました。

次の目標を満たします。

  • 簡単な統合
  • コンパイル時にlibを簡単に削除
  • 実行時にlibを簡単に削除
  • マルチスレッドアプリケーションのサポート
  • 分散システムのサポート
  • 影響を最小限に抑える

これらのポイントはプロジェクトwikiからリッピングされました。詳細については、こちらをご覧ください。

免責事項:CxxProfの主な開発者


1

本格的なプロファイラーではありませんが、捨てるだけです。イベントの処理に時間がかかるハングしたイベントループが必要な場合は、Qtでアドホックツールを使用するのは簡単です。このアプローチは、各イベントの処理にかかった時間、それらのイベントの内容などを追跡するために簡単に拡張できます。これは普遍的なプロファイラーではなく、イベントループ中心のプロファイラーです。

Qtでは、すべてのクロススレッドシグナルスロットコールは、タイマー、ネットワークおよびシリアルポート通知、すべてのユーザーインタラクションと同様に、イベントループを介して配信されます。したがって、イベントループを観察することは、アプリケーションが時間を費やしている場所を理解するための大きな一歩です。


0

もともとNuMegaによって開発され、現在MicroFocusによって配布されているDevPartnerは、かつてプロファイリングとコード分析(メモ​​リやリソースリークなど)に最適なソリューションでした。私は最近それを試したことがないので、それがあなたを助けることをあなたに保証することはできません。しかし、私はかつてそれで優れた結果を得たので、これは私がコード品質プロセスに再インストールすることを検討する代替案です(14日間のトライアルを提供します)。


0

あなたのOSはwin7ですが、プログラムはXPで実行できませんか?XPでプロファイルしてみてください。結果はwin7のヒントになります。


確かに可能ですが、そのためには、目的の開発環境を十分にサポートできない、または何年もかかる可能性がある製品のライセンスを購入する必要があります。1.5kは賭けるのに多額のお金であり、さらにXPボックスのイメージングと展開の時間にかかるコストです。
Jake Kurzer

0

ここにはたくさんのプロファイラーがリストされており、自分でいくつか試してみましたが、これに基づいて自分でプロファイラーを作成しました。

http://code.google.com/p/high-performance-cplusplus-profiler/

もちろん、コードベースを変更する必要がありますが、ボトルネックを絞り込むのに最適であり、すべてのx86で動作するはずです(マルチコアボックスで問題になる可能性があります。つまり、rdtscを使用しますが、これは純粋に指示的なタイミングのためです) -だから私はそれで十分だと思う。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.