Profiler没有时间跳转,但是比较时间很长

时间:2016-05-03 17:09:17

标签: c++ performance profiling

在测试自定义堆管理器的工作时(替换系统一),与系统堆相比,我遇到了一些减速。

我使用AMD CodeAnalyst在Windows 7,Intel Xeon CPU E5-1620 v2 @ 3.70 GHz上分析x64应用程序。并得到以下结果:

Profile results

此块占用整个应用程序运行的大约90%的时间。我们可以看到花费在"cmp [rsp+18h], rax""test eax, eax"上的大量时间,但没有花时间在比较之下的跳跃。跳跃不花时间吗?是因为分支预测机制吗?

我把条款更改为相反的条款,这里我已经得到了(结果在绝对数字上有点不同,因为我手动停止了分析会话 - 但仍然需要花费很多时间来进行比较< / em>的): enter image description here

对于这些比较有如此多的呼吁,他们成了瓶颈...这就是我如何解释这些结果。可能最好的优化是重新编写算法,对吗?

1 个答案:

答案 0 :(得分:1)

Intel和AMD CPU macro-fuse cmp/jcc pairs into a single compare-and-branch uop(Intel)或macro-op(AMD)。像你这样的英特尔SnB系列CPU可以通过一些写入输出寄存器的指令来完成此操作,例如andsub / addinc / dec

要真正了解分析数据,您必须了解有关无序管道如何在您正在调整的微架中工作的内容。请参阅代码wiki上的链接,尤其是Agner Fog's microarch pdf

您还应该注意,分析周期计数可以从等待结果的指令中收费,而不是生成缓慢的指令。