0

アプリケーションのプロファイルを作成しましたが、関数が遅延の原因ではなく、winform関数が原因であることがわかりました。どうすればこれを修正できますか?説明については、これを参照してください。

そして、これはプロファイリングの結果です。

4

2 に答える 2

2

あなたはそれを修正することはできません。

フレームワークは、Windows APIによって公開されているDispatchMessage関数を呼び出しています。この関数は、関数の呼び出しによって取得されたメッセージをGetMessage特定のウィンドウのウィンドウプロシージャにディスパッチするために使用されます。

ここでの「遅い」部分はWindows自体です。それがボトルネックになると、アプリケーションは十分に最適化され、それ以上できることはありません。

また、これらのプロファイルの結果は、この関数が遅いことを必ずしも示しているわけではありません。むしろ、彼らはそれがたくさん呼ばれる(「ヒットカウント」)とあなたに言っています。アイデアは、頻繁に呼び出される関数がコードの「ホットポイント」であり、それらの実装を最適化するために余分な時間をかける価値があるということです(あなたのお金のためにより多くの価値があります)。ただし、この場合、Windowsがアプリのメッセージを処理する方法であるため、この関数は頻繁に呼び出されます。アンマネージコードとネイティブWindowsAPIの世界では、メッセージは.NETコードで使用するイベントのようなものです。何か面白いことが起こるにはイベントを発生させる必要があるため、それらのイベント(メッセージ)の呼び出しまたはディスパッチを担当する関数は、頻繁に呼び出されることになります。

于 2011-04-12T16:19:22.053 に答える
1

Windowsアプリには通常、マウスの動き/クリックやキーボードのヒットなどの外部イベント、または内部で生成されたイベントを待機するトップレベルのループが含まれています。イベントが発生すると、適切なハンドラーが呼び出されます。通常、それはかなり広範で深い呼び出しツリーを歩きますが、それがすぐに終了した場合、それはただ待機に戻ります。

うまく機能しているように見えるアプリは、壁時計時間のほとんどを次の外部イベントの待機に費やしています。

パフォーマンスが低いように見えるアプリは、ほとんどの時間をイベントに応じてコールツリーを歩くことに費やしています。

パフォーマンスを向上させる方法は、ボトルネックを特定して取り除くことです。ボトルネックは、ほとんどの場合、コード内の呼び出しツリーで、コストがかかることを知らなかった関数呼び出しで構成されます。コードに含まれていない呼び出しツリーの部分は、何もできないことですが、それらを呼び出さないようにできれば、スピードアップする機会があります。

あなたがマネージャーであるかのように、従業員が時間を無駄にしているかどうかを確認しようとしているのと同じように、予告なしに立ち寄って、彼らが何をしているかを確認できます。ソフトウェアでは、これがあなたがそれを行う方法です

1)ルーチンの「セルフタイム」を通知する、2)関数が呼び出される回数を通知する、3)大規模であるがほとんど無関係なグラフまたはテーブルを提供する、4)ロットなどと混同するプロファイラーに注意してください。キャッシュミスやスレッドスイッチなど、興味深いが通常は関連性のない手がかりの

ボトルネックを見つけるのは非常に簡単です。なぜなら、小さい場合は実際にはボトルネックではなく、大きい場合は、無駄になっている間、スタック上にあり、通知を待っているだけだからです。 これがそのテーマの詳細です。

于 2011-04-12T21:57:18.267 に答える