定时器报告的时间与真实时间
我有两块做相同操作的代码。 一个是我自己写的,另一个是第三方写的。 它们都被编译成一个可执行文件。 第三方代码似乎能够比我的工作快得多。 与我的500相比,它可以每秒执行1,500次操作。然后,我使用调用图分析选项在VTune中运行可执行文件,希望这能够显示我浪费时间的地方。 不幸的是,VTune诊断程序显示它认为每个函数需要的微秒数,声称我的函数和第三方函数每次调用大约需要0.002秒。 这是我的代码的亮点,但完全不符合我对第三方代码速度的(手动)测量。
这怎么会发生?
编辑:这两个代码块都很大,并调用它们自己的子函数的复杂树。
编辑:我应该指出,第三方代码是纯C ++,而我的代码本质上是C编译器中编译的C代码。
编辑:VTune是一个非常复杂的软件包,加载了我不明白的配置选项。 可能有一些设置可以降低这种不准确性吗?
您对'真正时机'的定义可能需要修改。 比较苹果和梨时,你不能声称探查器是错误的。
Profiler可用于相对定时; 使用探查器在代码中查找“热点”,然后使用这些信息优化该区域。
在一个实际的说明中:寻找一个采样分析器,它通常比跟踪/仪器分析器的开销/影响少得多
(PS也在Schrodinger / Heisenberg上阅读)
我已经看到了一些情况,其中剖析器人为地夸大了某些函数/系统调用的报告时间。 这可能是因为第三方图书馆正在使用一些此类电话并与之挂钩。
您是否尝试过使用高性能时钟(Solaris中的gethrtime
或Windows中的QueryPerformanceCounter
)并将功能的总次数测量为完整性检查?
你的操作听起来很慢,不受CPU限制 - 它们是I / O绑定的吗? 您的I / O代码是否比图书馆的优化程度低? 这不一定会显示在CPU配置文件报告中。
如果您使用挂墙时间(即经过的秒数而不是CPU计数器),则还需要考虑阻止系统调用花费的时间。 例如,假设你没有做太多的文件I / O,你可能花费大量的时间将信息输出到控制台。 控制台I / O不会显示为CPU时间,因为大部分时间只是等待更新控制台。
您可以使用GetThreadTimes(...)
来确定您在代码和系统代码中花费了多少时间。 我已经使用这个和系统调用采样来减少上下文切换(并最终提高整体性能)。