2011-04-19 38 views
1

我有两个块做相同的操作代码。一个是我自己写的,另一个是第三方写的。它们都被编译成一个可执行文件。第三方代码似乎能够比我的工作快得多。与我的500相比,它可以每秒执行1,500次操作。然后,我使用调用图分析选项在VTune中运行可执行文件,希望这能够显示我浪费时间的地方。不幸的是,VTune诊断程序显示它认为每个函数需要的微秒数,声称这两个我的函数和第三方函数每次调用大约需要0.002秒。这是我的代码的亮点,但完全不符合我对第三方代码速度的(手动)测量。Profiler与真实时机报告的时间 - 为什么差异?

这是怎么发生的?

编辑:这两个代码块都很大,并调用他们自己的复杂子树功能。

编辑:我应该指出,第三方代码是纯粹的C++,而我的代码基本上是C编译的C代码。

编辑:VTune是一个非常复杂的软件包,带有负载的配置选项我不明白。可能有一些设置可以降低这种不准确性吗?

+0

如果您将它们编译到同一个可执行文件中,您可能会得到缓存或堆作用,从而使第一次或第二次测试运行速度最快。更改订单有时会改变结果! – 2011-04-19 15:54:55

回答

2

'true timing'的定义可能需要修订。比较苹果和梨时,你不能声称探查器是错误的。

轮廓仪可用于相对定时;使用探查器在代码中查找“热点”,然后使用这些信息优化该区域。

在实践注:寻找一个采样分析器,它通常具有比跟踪开销/冲击小得多/插装探查

0

我(PS 上薛定谔/海森堡又读了)我们看到了一些情况,其中剖析器人为地夸大了某些函数/系统调用的报告时间。这可能是因为第三方图书馆正在使用一些此类电话并与之挂钩。

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

你的操作听起来很慢CPU绑定 - 它们是I/O绑定?您的I/O代码是否比图书馆的优化程度低?这不一定会显示在CPU配置文件报告中。

+0

QueryPerformanceCounter是我的手动计时机制。 – Mick 2011-04-19 13:59:46

+0

它的所有CPU绑定 - 功能做了很多东西! – Mick 2011-04-19 14:00:17

0

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

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

相关问题