5

我在我的应用程序的“RelDebug”版本上运行 Visual Studio 2008 探查器。优化已开启,但内联只是适度的,存在堆栈帧,并发出符号。换句话说,RelDebug 是一个经过一定程度优化的可以调试的构建(尽管适用于检查变量的通常发布警告)。

我在单独的运行中同时运行采样和检测分析器。

结果?采样分析器产生看起来合理的结果。但是,当我查看 Instrumented 分析器结果时,我看到甚至不应该靠近列表顶部的函数出现了。

例如,像“SetFont”这样的函数,它只包含 1 行将高度分配给类成员。或仅分配一个矩形的“SetClipRect”。

当然,我正在查看“独家”统计数据(即减去儿童)。

这发生在其他人身上吗?一旦我的应用程序增长到一定大小,它似乎总是会发生。它使检测分析器在这一点上毫无用处。

我解决了这个问题。Visual Studio 2008 和 Visual Studio 2010 分析器都是平庸的(礼貌地说)。我购买了带有 vTune Amplifier(分析器)的 Intel C++ Studio。在完全相同的代码上使用英特尔分析器,我能够获得真正有意义的分析器结果。

4

2 回答 2

2

你说“当然你在看独家”。查看包容性统计数据。除了最简单的程序或算法之外,几乎所有的时间都花在了子程序和函数上,所以如果你遇到性能问题,它很可能是由你不知道的调用构成的。

我依赖的方法是这样的。假设您正在尝试找出可以解决的问题以使代码更快,它会找到它,同时不会浪费您的时间对没有问题的事物进行高精度统计。

于 2009-08-31T19:43:17.060 回答
1

没有错误。抽样无法告诉您每次通话花费了多少时间。Profiler 只是计算计时器在该特定功能中结束的次数。由于不经常调用 SetFont,因此您不会在该函数中获得很多点击,并且您会觉得该函数并不耗时。

另一方面,当您运行检测时,分析器会计算每次调用并测量每个函数的执行时间。这就是为什么您可以获得有关函数 CPU 消耗的准确信息的原因。

在检查检测结果时,您还必须始终查看调用次数。由于 SetFont 是更少的 API,因此它是独占的还是包容的并不重要。唯一重要的是它的总时间和调用频率。

于 2009-09-01T07:37:43.723 回答