我在我的应用程序的“RelDebug”版本上运行Visual Studio 2008探查器。优化已启用,但内联仅适中,存在堆栈帧,并且会发出符号。换句话说,RelDebug是一个可以调试的有点优化的构建(尽管有关检查变量的常见Release警告适用)。
我在不同的运行中运行Sampling和Instrumented profiler。
结果?采样分析器产生的结果看起来合理。但是当我查看Instrumented profiler结果时,我看到的功能甚至不应该在列表的顶部附近,最终会出现。
例如,像“SetFont”这样的函数,它只包含一行,将高度分配给一个类成员。或者只是指定一个矩形的“SetClipRect”。
当然,我正在看“独家”统计数据(即减去儿童)。
这发生在其他人身上吗?一旦我的应用程序增长到一定的大小,它似乎总会发生。这使得仪表化的分析器在那时毫无用处。
我发现了问题。 Visual Studio 2008和Visual Studio 2010分析器都是平庸的(礼貌地说)。我买了带有vTune放大器(一个分析器)的英特尔C ++ Studio。在完全相同的代码上使用英特尔配置文件,我能够获得真正有意义的分析器结果。
答案 0 :(得分:2)
你说“当然你正在看独家”。看看包容性统计数据。除了最简单的程序或算法之外,几乎所有的时间都花在子程序和函数上,所以如果你遇到了性能问题,那么很可能是你不知道的时间长的电话。
我依赖is this的方法。假设你试图找出你可以解决的问题,以使代码更快,它会找到它,而不是浪费你的时间与高精度的统计数据有关的问题。
答案 1 :(得分:1)
没有错误。抽样不能告诉你每次通话花了多少时间。 Profiler只计算计时器在该特定功能中结束的次数。由于不经常调用SetFont,因此您不会在该函数中获得很多匹配,并且您会觉得该函数不耗时。
另一方面,当您运行检测时,分析器会对每个调用进行计数并测量每个函数的执行时间。这就是您获得有关CPU消耗功能的准确信息的原因。
检查检测结果时,您还必须始终查看检测次数。由于SetFont是更少的API,因此无论是独占还是包容都无关紧要。唯一重要的是它的整体时间以及它的召唤频率。