1

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

这怎么可能发生?

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

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

编辑:VTune 是一个非常复杂的包,其中包含我不理解的大量配置选项。是否有一些设置可以减少这种不准确性?

4

3 回答 3

2

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

Profilers 可用于相对计时;使用分析器在您的代码中查找“热点”,然后使用该信息来优化该区域。

实用说明:寻找采样分析器,它的开销/影响通常比跟踪/仪器分析器小得多

(PS也阅读了薛定谔/海森堡

于 2011-04-19T12:17:15.003 回答
0

我见过探查器人为地夸大某些函数/系统调用的报告时间的情况。可能是第 3 方库正在使用一些这样的调用并与之挂钩。

您是否尝试过使用高性能时钟(gethrtime在 Solaris 或QueryPerformanceCounterWindows 中)并测量功能的总时间作为健全性检查?

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

于 2011-04-19T13:40:29.760 回答
0

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

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

于 2011-04-19T16:45:00.697 回答