3

私が不自然なプログラムを持っているとしましょう:

#include <Windows.h>

void useless_function()
{
    Sleep(5000);
}

void useful_function()
{
    // ... do some work
    useless_function();
    // ... do some more work
}

int main()
{
    useful_function();
    return 0;
}

目的: プロファイラーに、明らかな理由もなく待機してuseful_function()いる不必要な呼び出しを教えてもらいたいです。useless_function()XPerf では、自分のプログラムではなくへの呼び出しWaitForMultipleObjects()が考慮されているように見えるため、これはどのグラフにも表示されません。Idle.exe

そして、これが私が現在実行している xperf コマンドラインです。

xperf -on Latency -stackwalk Profile

何か案は?

(これは待機関数に限定されません。上記の問題は、にブレークポイントを配置することで解決された可能性がありますNtWaitForMultipleObjects。理想的には、CPU 時間だけではなく、多くのウォール クロック時間を消費しているスタック サンプルを確認する方法が存在する可能性があります)。

4

3 に答える 3

2

あなたが探しているのは、Xperf のReady Thread 機能を使用した待機分析だと思います。すべてのコンテキスト スイッチをキャプチャし、スレッドがスリープ (またはブロックされた操作) から復帰すると、スレッドのコール スタックを提供します。あなたのケースでは、呼び出し sleep(5000) の直後にスタックと、スリープに費やした時間が表示されます。

機能は少し使いにくいです。しかし、幸いなことに、ここでよく説明されています。

アプリケーション パフォーマンスのトラブルシューティングに Xperf の待機分析を使用する

于 2012-06-15T00:04:05.853 に答える
0

この「プロファイラー」が教えてくれます - ランダムに数回一時停止し、スタックを見てください。do some work5 秒かかり、5 秒かかる場合do some more work、33% の確率でスタックは次のようになります。

main: calling useful_function
useful_function: calling useless_function
useless_function: calling Sleep

つまり、スタック サンプルの約 33% がまさにそれを示しています。実時間の何分の一かを消費しているコード行は、ほぼその分数のサンプルに表示されます。

残りのサンプルでは、​​他のことを行っていることがわかります。

ZoomLTProfなど、よりきれいな方法で同じことを行う自動化されたプロファイラーがありますが、実際にはサンプルは表示されません。

xperf docを見て、実時間でスタック サンプルを取得し、ライン レベルの解像度でパーセントを取得できるかどうかを調べようとしました。Windows 7 または Vista を使用している必要があるようです。彼らは、現実的に大きな関数を持っている場合に重要な行ではなく、関数だけを気にします。個々のサンプルにアクセスする方法がわかりませんでした。これは、プログラムが時間を費やしている理由を確認するために重要だと思います。

于 2010-11-13T20:36:50.600 に答える