上位 3 つの関数はすべてスレッド同期オブジェクトとして表示されます。ほとんどWaitForSingleObject()
。
この関数は、スレッドのステータスを確認するために 0 で呼び出された場合でも、非常に負担がかかりますか? これらの関数の値に非常に関心を持ち、それがプロファイルする他の値よりもセルフタイムで 2 桁多く表示されます。あるいは、Glowcode がこの関数に夢中になっているだけかもしれません。
上位 3 つの関数はすべてスレッド同期オブジェクトとして表示されます。ほとんどWaitForSingleObject()
。
この関数は、スレッドのステータスを確認するために 0 で呼び出された場合でも、非常に負担がかかりますか? これらの関数の値に非常に関心を持ち、それがプロファイルする他の値よりもセルフタイムで 2 桁多く表示されます。あるいは、Glowcode がこの関数に夢中になっているだけかもしれません。
まず、セルフタイムを見ないでください。
そこにある唯一の理由は、誰かが独自のコードでタイトな CPU ループに多くの時間を費やすコードを作成する可能性があるためです。あなたのプログラムは、行列の反転や FFT の実行にすべての時間を費やしていますか?
gprofが発明され、その後のプロファイラーが雪崩のように大量に発生した理由のすべては、実際のソフトウェアには、大きなネズミの巣で相互に呼び出すサブルーチンが多数含まれているためです。それは避けることができました。セルフタイムはそれらを公開しません。
次に、Wall 時間または CPU 時間のどちらを見ているかに関係なく、WaitForSingleObject() がアクティブな時間の大部分を占めている場合、それはスレッドがほとんど何かを待っていることを意味します。あなたは何を見つける必要があります。
見つけるための非常に簡単な方法があります。Pause、Ctrl-C、Esc、またはそのトラックで停止する任意のキーを押してから、スタックを確認します。コール スタック上のすべてのコード行は、満たされていない要求を表しており、その要求が行われていなければ、プログラムは待機していません。それが、何が待っているかを知る方法です。
WaitForSingleObject() にないときにそれをキャッチした場合は、もう一度、おそらく数回実行してください。これはプロファイリングよりも手間がかかるように思えるかもしれませんが、問題を見つけるか、簡単なことを行うかを選択できます。