假设我有一个精心设计的程序:
#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时间)。
发布于 2012-06-15 00:04:05
我认为您正在寻找的是在Xperf中具有就绪线程功能的等待分析。它捕获每个上下文开关,并在线程从睡眠(或其他阻塞的操作)中醒来后,为您提供调用堆栈。在您的示例中,您将看到调用睡眠(5000)之后的堆栈以及花在睡眠中的时间。
这个功能使用起来有点模糊。但幸运的是,这里描述得很好:
使用Xperf的等待分析进行应用程序性能故障排除
发布于 2015-02-22 05:45:25
等待分析就是这样做的。您应该:
然后,在WPA (或xperfview,但这是很古老的)中使用CPU使用率(精确)来查看上下文开关,并在不应该空闲的线程上找到TimeSinceLast高的位置。您通常希望按这种顺序使用CPU中的列(精确):
有关详细信息,请参阅我博客中的以下特定文章:- https://randomascii.wordpress.com/2014/08/19/etw-training-videos-available-now/ - https://randomascii.wordpress.com/2012/06/19/wpaxperf-trace-analysis-reimagined/
发布于 2010-11-13 20:36:50
这个“分析器”会告诉你-只是随机暂停它几次,看看堆栈。如果do some work需要5秒,do some more work需要5秒,那么堆栈的33%的时间将如下所示
main: calling useful_function
useful_function: calling useless_function
useless_function: calling Sleep因此,大约33%的堆栈样本将准确地显示这一点。任何一行代码,如果花费的是时钟时间的一小部分,就会出现在样本的大致上。
在其余的示例中,您将看到它正在做其他事情。
有些自动分析器以更漂亮的方式做同样的事情,比如缩放和LTProf,尽管它们实际上并没有向您展示示例。
我查看了xperf文档,试图找出是否可以在挂钟时间获得堆栈样本,并获得行级分辨率的百分比。看来你一定是在Windows 7或Vista上。它们只关心函数,而不是行,如果您有实际的大函数,这是很重要的。我不知道如何访问单个样本,我认为这对于了解程序为什么要花费时间是很重要的。
https://stackoverflow.com/questions/4174204
复制相似问题