[解決済み] スタックサンプリングの先にあるもの。C++プロファイラ
質問
ハッカー物語
日付は2010年12月02日。 クリスマス前の日々が垂れ流しになっていますが、Windowsプログラマーとしてかなり大きな壁にぶち当たっています。 AQTimeを使っていて、sleepy、shiny、very sleepyと試してきて、今現在、VTuneをインストールしているところです。 VS2008のプロファイラを使おうとしたが、正に懲り懲りであり、また、しばしば理解不能であった。 ランダムポーズのテクニックを使ってみた。 コールツリーを調べてみた。 関数トレースもやった。 しかし、悲しいかな、私が携わっているアプリは100万行を超えるコードで、さらに100万行相当のサードパーティアプリが含まれているという事実があります。
もっと良いツールが必要だ。 他のトピックを読みました。 各トピックで紹介されているプロファイラーをそれぞれ試してみた。 これらのジャンキーで高価なオプションや、ほとんど何の利益もないためにおろかな量の作業をするよりも、単純に何か良いものがあるはずです。 さらに問題を複雑にするのは、私たちのコードは大きくスレッド化されており、Qt のイベントループをいくつも走らせています。 なぜ複数のイベントループを実行しているのか、私に聞かないでください。 誰も教えてくれません。
Windows環境でValgrindに近い選択肢はないのでしょうか?
私がすでに試した、長い間の壊れたツールより良いものはありますか?
Qt と統合するように設計されたもので、おそらくキュー内のイベントを便利に表示するものはないでしょうか?
私が試したツールの全リスト。本当に便利だったものは斜体で表示。
- AQTime むしろ良い! しかし、コールグラフはこのような場合にも正しく表示されるので、混乱を解消するために使用することができます。 完璧なツールではないが、試してみる価値はある。 あなたのニーズにも合うかもしれませんし、確かに私にとってはほとんどの場合、十分なものでした。
-
デバッグモードでのランダムポーズ攻撃。
情報量が十分でない。
良いツールだが、完全な解決策ではない。 - パラレルスタジオ 核の選択肢。 押し付けがましく、奇妙で、狂おしいほどパワフル。 30日間の評価を受け、自分に合うかどうかを判断するのがいいと思います。とにかくカッコいいんです。
- AMD Codeanalystです。 素晴らしい、使いやすい、非常にクラッシュしやすいが、それは環境の問題だと思う。 無料なので、試してみることをお勧めします。
- ルーク・スタックウォーカー 小規模なプロジェクトでは問題なく動作しますが、私たちのプロジェクトで動作させるのは少し大変です。 でも、いい結果も出ていますし、個人的な作業では間違いなくSleepyに取って代わりますね。
- ピュリファイプラス Win-x64環境(特にWindows 7)に対応していない。 それ以外は素晴らしい。 他の部署の多くの同僚がこの製品を愛用しています。
- VS2008 プロファイラー。関数トレースモードで、必要な解像度で100ギガ以上の出力が得られます。 逆に言えば、しっかりした結果が得られる。
- GProf: GCCが必要です。
- VTune。VTuneのW7サポートは犯罪的と言えるほどです。それ以外は優秀
- PIN:自分でツールをハックする必要があるので、これは最後の手段みたいなものです。
- SleepyVerySleepy: 小さいアプリでは便利だが、ここでは失敗。
- EasyProfiler。インスツルメントする場所を示すために手動でコードを注入することを気にしないのであれば、悪くない。
- OProfile。Linuxのみ。
- プロフィ:野生の馬を撃つんです。
ヴァルグラインド *nixのみですが、その環境にいるときはとてもよいです。
試していないツールの提案。
- XPerf
- グローコード
- デブパートナー
注意事項 現時点でのIntel環境。 VS2008、ブーストライブラリ。 Qt 4+。 そして、その中でも特に惨めなハムスター。Qt/MFCの統合はtrolltechで。
今すぐ 約2週間後、私の問題は解決されたようです。 リストにあるほぼすべてのツールと、私の個人的なトリックを含むさまざまなツールのおかげで、主要なボトルネックを見つけることができました。 しかし、私は、新しいプロファイラーや新しい技術をテストし、探求し、試し続けるつもりです。 なぜか? それは、君たちのおかげだからだ。君たちが素晴らしいからだ。 タイムラインは少し遅くなりますが、それでも新しいツールを試し続けることに、とても興奮しています。
あらすじ
他の多くの問題の中で、最近多くのコンポーネントが不正なスレッドモデルに切り替わり、私たちの下にあるコードが突然マルチスレッドでなくなったために深刻なハングアップを引き起こしたのです。 これ以上はNDAに違反するので言えませんが、何気ない点検や通常のコードレビューでも決して見つからなかったと言えます。 プロファイラ、コールグラフ、ランダムポーズを併用しなければ、私たちはまだ空の美しい青い弧に向かって怒りを叫び続けていたことでしょう。 ありがたいことに、私はこれまで出会った中で最高のハッカーたちと働いていますし、素晴らしいツールと素晴らしい人々でいっぱいの素晴らしい「バース」にアクセスすることができます。
皆さん、大変ありがとうございます。 しかし、これはSOでこれまで得られた答えよりも良い答えを得るための重要な質問だと思います。
その結果、これから3週間、毎週、私が出せる最大の懸賞金をかけ、最も素敵なツールで、かつ、一般常識ではないと思われる回答者に授与します。 3週間後には、プロファイラーたちの決定的なプロフィールが蓄積されていることを期待しているのだが、洒落はさておき。
テイクアウェイ
プロファイラーを使用する。 リッチー、カーニガン、ベントレー、クヌースには十分な性能を持っています。あなたが誰であろうと関係ありません。 プロファイラーを使うんだ 今持っているのがダメなら 他を探せ 見つからなければコードを書け。 コーディングできない、あるいはちょっとしたハングアップ、あるいは行き詰まったら、ランダムポーズを使え。 もしすべて失敗したら、大学院生を何人か雇ってプロファイラを作らせましょう。
長い目で見る
そこで、ちょっと回顧録を書いてみるのもいいかもしれません。 私がParallel Studiosを多用することにしたのは、実はPIN Toolの上に構築されていることも理由のひとつです。 研究者の方々と学術的なお付き合いをしていることもあり、これはある程度のクオリティがあることの証だろうと思ったのです。 ありがたいことに、その通りでした。 GUIはちょっとひどいですが、IPSは非常に便利だと思いました。 AQTや他の多くのプロファイラが提供している、行レベルのヒットカウントを取得する明白な方法がないことが致命的です。 また、AQTimeのサポートは非常に迅速で、楽しく使用することができました。 繰り返しになりますが、私の推薦を修飾する必要があります。 AQTimeの機能の多くはそれほどうまく機能しませんし、Win7x64ではクラッシュしやすいものもあります。 XPerfも立派に動作しましたが、ある種のアプリケーションで良好な結果を得るために必要なサンプリングの詳細については、苦痛を感じるほど遅いです。
今のところ、W7x64環境でC++コードをプロファイリングするための決定的なオプションはないと思いますが、単に有用なサービスを提供できないオプションがあることは確かです。
どのように解決する?
まず
タイムサンプリングプロファイラの方が、CPUサンプリングプロファイラより堅牢です。 私はWindowsの開発ツールに極めて疎いので、どれがどれとは言えません。 ほとんどのプロファイラがCPUサンプリングです。
CPUサンプリングプロファイラでは、N命令ごとにスタックトレースを取得します。
このテクニックは、CPUに依存しているコードの一部を明らかにします。 もしそれがアプリケーションのボトルネックになっているのであれば、これは素晴らしいことです。 アプリケーションのスレッドが、ほとんどの時間をミューテックスをめぐって争っている場合は、あまり良いことではありません。
タイムサンプリングプロファイラーは、Nマイクロ秒ごとにスタックトレースを取得します。
このテクニックは
"遅い"。
コードです。 その原因がCPUバウンド、ブロックIOバウンド、ミューテックスバウンド、キャッシュスラッシュのコードのセクションであろうと、です。 要するに、アプリケーションの速度を低下させているコードがあれば、それが目立つようになるのです。
そのため、特にスレッドコードのプロファイリングでは、可能な限りタイムサンプリングプロファイラを使用してください。
2つ目
サンプリングプロファイラーは膨大なデータを生成します。 このデータは非常に有用なものですが、多すぎて使い勝手が悪いことがよくあります。 そこで役立つのが、プロファイルデータのビジュアライザーです。 私が見つけたプロファイルデータの可視化に最適なツールは次のとおりです。 gprof2dot . 名前に惑わされず、あらゆる種類のサンプリングプロファイラの出力(AQtime、Sleepy、XPerfなど)を扱うことができます。 可視化によって問題のある関数を指摘したら、生のプロファイルデータにジャンプして、本当の原因が何であるかについてより良いヒントを得ることができます。
gprof2dot ツールが生成するのは ドットグラフの説明 を入力し、それを グラフビズ というツールがあります。 出力は基本的にコールグラフで、アプリケーションに与える影響度によって関数が色分けされています。
gprof2dot がきれいな出力をするためのヒントをいくつか紹介します。
-
を使っています。
--skew
を0.001で表示することで、ホットコードのパスを簡単に確認できるようにしました。 それ以外の場合はint main()
グラフを支配しています。 -
C++のテンプレートで何かおかしなことをしているのなら、おそらく
--strip
. これは特にBoostで顕著です。 -
サンプリングデータの生成にOProfileを使用しています。 良い出力を得るためには、サードパーティとシステムライブラリからデバッグシンボルをロードするように設定する必要があります。 そうしないと、CRTがアプリケーションの20%の時間を消費していることがわかります。
malloc
がヒープを破壊して15%を食いつぶしています。
関連
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み] *.h または *.hpp をクラス定義に使用します。
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】いくつかの良い.NETプロファイラーとは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】'cout'は型名ではない
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】デバッグアサーションに失敗しました