【问题标题】:Timings reported by profiler vs true timings - why the discrepancy?分析器报告的时间与真实时间 - 为什么会出现差异?
【发布时间】:2011-08-08 15:10:58
【问题描述】:

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

怎么会这样?

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

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

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

【问题讨论】:

  • 如果将它们编译成同一个可执行文件,您可能会获得缓存或堆效应,从而使第一个或第二个测试运行得最快。改变顺序有时会改变结果!

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


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 受 CPU 限制 - 函数做了很多事情!
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多