分析器报告的时间与真实时间——为什么会有差异
Timings reported by profiler vs true timings - why the discrepancy?
我有两段代码执行相同的操作。一块是我自己写的,另一块是第三方写的。它们都被编译成一个可执行文件。第三方代码似乎比我的代码完成工作要快得多。它每秒可以执行1500次操作,而我每秒只能执行500次。然后我在VTune中运行可执行文件,使用callgraph profiling选项,希望这能揭示我浪费时间的地方。不幸的是,VTune诊断显示了它认为每个函数所花费的微秒数,它声称我的函数和第三方函数每次调用大约花费0.002秒。这对我的代码来说似乎是正确的,但与我对第三方代码的速度(手动)测量完全不一致。
怎么会这样?
编辑:两个代码块都很大,并且调用它们自己的子函数的复杂树。
编辑:我应该指出第三方代码是纯c++的,而我的代码本质上是C代码,刚刚在c++编译器中编译。
编辑:VTune是一个非常复杂的软件包,有很多我不理解的配置选项。是否有一些设置可以减少这种不准确性?你对"真计时"的定义可能需要修改了。当比较苹果和梨时,你不能说分析器是错误的。
分析器可用于相对计时;使用分析器查找代码中的"热点",然后使用该信息对该区域进行优化。
一个实用的注意事项:寻找一个采样分析器,它通常比跟踪/检测分析器的开销/影响要小得多
(PS 还要阅读薛定谔/海森堡)
我看到过分析器人为地夸大某些函数/系统调用的报告时间的情况。这可能是第三方库正在使用一些这样的调用并与之挂钩。
您是否尝试过使用高性能时钟(Solaris中的gethrtime
或Windows中的QueryPerformanceCounter
)并测量函数的总时间作为完整性检查?
你的操作听起来真的很慢CPU限制-他们是I/O限制?您的I/O代码是否不如库的优化?这根本不需要在CPU配置报告中显示。
如果您正在使用隔离时间(即,用经过的秒数而不是CPU计数器),您还需要考虑阻塞系统调用所花费的时间。例如,假设您没有做太多的文件I/O,那么您可能会花费大量时间将信息打印到控制台。控制台I/O不会显示为CPU时间,因为大部分时间只是等待更新控制台。
您可以使用GetThreadTimes(...)
来确定您在代码和系统代码上花费了多少时间。我已经使用这个和系统调用采样来减少上下文切换(并最终提高整体性能)。
- 使用简单类型列表实现的指数编译时间.为什么
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 为什么字符串比较的 == 运算符相对于任一字符串长度线性时间(似乎)?
- 为什么根据测量位置测量经过的时间时会有很大的不同?
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- 我不明白为什么我的代码不起作用并且需要更长的时间来运行
- 为什么切换 for 循环的顺序会显著改变执行时间?
- 为什么一种算法在相同的时间复杂度下比另一种算法更快?
- 为什么在C++中获取日期和/或时间如此复杂?
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 为什么 std::chrono 在测量循环和编译器优化的并行 OpenMP 的执行时间时不起作用?
- 随着时间的推移,我的程序越来越慢,我不知道为什么.内存泄漏
- 为什么for循环中的异步不能提高执行时间
- 为什么Regex(c++)需要指数时间
- C++,自使用boost和std::chrono的纪元以来的时间?为什么 Boost 版本慢 10 倍?
- 为什么 C++ openMP 程序执行时间更长
- 为什么 Boost unordered_map 在第一次插入时需要太多时间?
- C++字符串与C#字符串,不同的运行时间.为什么?
- 从矢量中删除比从列表中删除花费更少的时间.为什么?
- 分析器报告的时间与真实时间——为什么会有差异