私はこの点をSOにしています。
あなたのオブジェクトが壁時計の時間で測定されたようにパフォーマンスを向上させることである場合、最も良いツールはデバッガそのものとその「一時停止」ボタンだけです。 理由を教えてください。
まずは、良いプロファイラプロファイラの中
を見てみましょう、ANTSは、おそらく彼らが来るほど良いです。私はアプリ上でそれを実行すると は、画面の上部には、次のようになります。あなたが見て時間帯を選択する必要が
お知らせ、そしてあなたが見てみたい場合は、選択する必要がありますCPU時間またはファイルI/O時間で実行されます。唯一のCPU時間を考慮し、「ホットパス」で考えるものANTS表示するようにしようとしている
:その期間内 は、あなたがこのような何かを参照してください。 もちろん、包括的な「子供との時間(%)」を強調しています。それは良いことです。 このような大きなコードベースでは、自己時間「時間(%)」がどのくらい極端に小さいかに注目してください。 それは典型的なことです。その理由が分かります。
これは、包括的な割合が低い機能を無視する必要があることを示しています。その機能をノーオプシップに減らすことができたとしても、その期間内の総時間は包括的な割合を下回るためです。
したがって、包括的なパーセンテージの高い関数を見て、それらの中に何かを見つけようとすると、時間がかかりません。一般的には、a)サブ関数の呼び出し回数を減らすか、b)関数そのものをlessと呼びます。
何かを見つけて修正すれば、ある程度のスピードアップが得られます。その後、もう一度試してみることができます。 修正するものが見つからないときは、勝利を宣言し、プロファイラを別の日に置きます。
さらに高速化するために修正しても問題はなかったかもしれないが、プロファイラが見つからない場合は、それらが存在しないとみなしていることに注意してください。 これは本当に大きな眠りになることがあります。
は、今度は、私はちょうどランダムにそれは私が待って作っていたので、私を盗聴されたフェーズの間にアプリ6回を一時停止し、いくつかのマニュアルのサンプル
てみましょう。 コールスタックのスナップショットを取るたびに、と私はプログラムが何をしているのか、なぜそれがそれをやっているのかをよく見てきました。 サンプルのうちの3つは、このように見えた:
外部コード
Core.Types.ResourceString.getStringFromResourceFileライン506
Core.Types.ResourceString.getTextライン423
Core.Types.ResourceString.ToStringライン299
外部コード
Core.Types.ResourceString.getStringFromResourceFileライン528
Core.Types.ResourceString.getTextライン423
Core.Types.ResourceString.ToStringライン299
Core.Types.ResourceString.implicitオペレータ列ライン404
SplashForm.pluginStartingライン149
Services.Plugins.PluginService.includePluginライン737
Services.Plugins.PluginService.loadPluginListライン1015
Services.Plugins.PluginService.loadPluginManifestsライン1074
Services.Plugins.PluginService.DoStartライン95
Core.Services.ServiceBase.Startライン36
Core.Services.ServiceManager.startServiceライン1452
Core.Services.ServiceManager.startServiceライン1438
Core.Services.ServiceManager.loadServicesライン1328
Core.Services.ServiceManager.Initializeライン346
Core.Services.ServiceManager.Startライン298
AppStart.Startライン95
AppStart.Mainライン42
それは何をしているのですか? リソースファイルを読み込んでいます(これはI/Oだから、CPU時間を見るとそれは見えません)。 それを読んでいる理由は、プラグインの名前を取得することです。 プラグインの名前がリソースファイル内にある理由は、その文字列を国際化するために今後の必要条件としてになる可能性があるためです。 とにかく、フェッチされている理由は、プラグインのロード中にスプラッシュ画面に名前を表示できるようにするためです。 おそらく、この理由は、ユーザーが何が長くかかるのか不思議であれば、スプラッシュ画面には何が起こっているのかが表示されます。
これらの6つのサンプルでは、名前が表示されなかった場合、または表示されていてより効率的な方法で取得された場合、アプリの起動速度は約となりました。
私は、測定値を表示することによって動作するプロファイラがこの洞察を迅速にもたらしたとは思えません。
プロファイラーがCPUではなく壁時計の時間によって包括的なパーセントを示したとしても、ルーチンの時間を要約すると、ほとんどすべてが失われるため、それが何をしているかを示す説明文脈は、が必要です。。
要約統計だけを見てコードを見ると、人間の傾向は「自分が何をしているかを見ることができますが、改善する方法はありません」と言います。
「統計的有意性」はどうですか?
私はいつもこれを聞いています。統計についてはnaiveteから来ています。
6つのサンプルのうち3つに問題がある場合は、問題で使用される可能性が最も高いのは3/6 = 50%です。 これは、これを何回も実行した場合、平均して(3 + 1)/(6 + 2)(これも50%)となります。 時間を50%節約すれば、2倍のスピードアップが得られます。 コストが20%になる可能性があります。この場合、スピードアップはわずか1.25倍になります。 コストは80%にもなる可能性があります。この場合、スピードアップは5倍(!)になります。 はい、それは賭けです。 スピードアップは見積もることができませんでしたが、ゼロにはならず、同様に劇的に大きくなる可能性があります。
さらに精度が必要な場合は、より多くのサンプルを取り込むことができますが、統計精度を得るためにサンプルを調べることによる洞察を犠牲にすると、スピードアップが見つからないことがあります。
P.S. This linkは、すべての問題を発見することの重要性を示しています。
+1素晴らしい詳細。私が手動で一時停止している1つの問題は、負荷の高いネットワークトラフィックでアドインをテストすることであり、各メッセージはVisioドキュメントに書き込まれる場合と書き込まれない場合があります。ドキュメントの読み書きは、私がずっと時間がかかると思われるものです(dotTraceで確認済み)。私はまだ手動スタック分析に非常に興味があります。そのメモで、上記のようにVSにコールバックトレースを表示させるにはどうしたらいいですか? –
@Adam:呼び出しスタックは表示可能なデバッグウィンドウの1つです。その内容をメモ帳やどこにコピーしても簡単に貼り付けることができます。複数のスレッドがある場合、それらはすべて同時に停止し、どのスレッドを表示するかを選択できます。通常、あなたはそのうちの1つだけを気にします。とにかく、私がやることは、デバッガの下でストレステストを実行することです。ドキュメントのI/Oに費やされる時間が長い場合は、それがポーズによって捕捉される確率です。 –
コールスタックを見つけました。ありがとうございました。今週末にプロジェクトに戻ったら、この方法をもう少し試してみましょう。 –