分析师报告的时间与真实时间 - 为何出现差异?

时间:2011-04-19 12:04:17

标签: c++ visual-studio-2008 windows-xp vtune

我有两个执行相同操作的代码块。我自己写的一块,另一块是第三方写的。它们都被编译成单个可执行文件。第三方代码似乎能够比我的更快地完成工作。与我的500相比,它每秒可以执行1,500次操作。然后我使用callgraph profiling选项在VTune中运行可执行文件,希望这会显示我在浪费时间的地方。不幸的是,VTune诊断显示了它认为每个函数所用的微秒数,声称​​两个我的函数和第三方函数每次调用大约需要0.002秒。这似乎是我的代码的亮点,但与我(第三方代码的速度)的(手动)测量完全不一致。

这怎么可能发生?

编辑:两个代码块都很大,并且调用它们自己的复杂的子函数树。

编辑:我应该指出第三方代码是纯C ++,而我的代码本质上是C代码,它刚刚在C ++编译器中编译。

编辑:VTune是一个非常复杂的包,有很多我不明白的配置选项。可能会有一些设置可以减少这种不准确性吗?

3 个答案:

答案 0 :(得分:2)

您对“真实时间”的定义可能需要修订。在比较苹果和梨时,你不能声称分析器是错误的。

剖面仪可用于相对定时;使用分析器查找代码中的“热点”,然后使用该信息优化该区域。

实际注意事项:寻找一个采样分析器,它通常比跟踪/仪表分析器具有更少的开销/影响

(PS 也阅读Schrodinger / Heisenberg

答案 1 :(得分:0)

我见过个人资料工作人为地夸大某些功能/系统调用的报告时间。可能是第三方图书馆正在使用一些此类电话并与之挂钩。

您是否尝试过使用高性能时钟(Solaris中的gethrtime或Windows中的QueryPerformanceCounter)并测量功能的总时间作为完整性检查?

您的操作听起来很慢,受CPU限制 - 它们是否受I / O限制?您的I / O代码是否优于库的优化?这根本不会出现在CPU配置文件报告中。

答案 2 :(得分:0)

如果您正在使用挂起时间(即经过的秒数而不是CPU计数器),则还需要考虑阻止系统调用所花费的时间。例如,假设您没有做太多文件I / O,您可能会花费大量时间将信息打印到控制台。控制台I / O不会显示为CPU时间,因为大部分时间只是等待更新控制台。

您可以使用GetThreadTimes(...)来确定您在代码与系统代码中花费的时间。我已经使用了这个和系统调用采样来减少上下文切换(并最终提高整体性能)。