如何计算C++中的操作?

MrD*_*ase 5 c++ performance

如何计算C++中的操作?我想以更好的方式分析代码,而不仅仅是计时,因为时间经常被舍入到0毫秒.

Gre*_*ill 7

如果你是计时代码,那么在循环中运行它很多次都是值得的,以避免计时器分辨率的影响.因此,您可以运行10,000次计时并测量运行所有迭代所需的时间.它可能只需要几秒钟就可以运行,您将获得更好的计时数据.


Jon*_*eet 5

在考虑性能时,使用"操作次数"是一个坏主意.它没有考虑每个操作的最佳情况/最坏情况周期计数之间的差异,缓存未命中的成本,管道未命中,潜在(自动)并行化等.

正如格雷格所说的那样,对于微基准测试而言,通常只需运行相同的代码足够长的时间就可以获得相当长的时间.

更好的方法是使用实​​际工作负载运行整个应用程序并测量您真正感兴趣的指标,但这是另一回事......

什么绝对有用的是制定出复杂代码的-当一个方法将是O(1),O(log n)的,为O(n)等等.这通常不涉及知道什么样的细节知识在C++中的单个指令做-尽管你根本需要知道的事情你打电话的复杂性.(Joel的故事Shlemiel the Painter和strlen是最明显的例子.)


Nic*_*lli 3

您可以通过读取 CPU 的时间戳计数器 ( tsc ) 来进行精确测量,该计数器在每个 cpu 时钟时加一。

不幸的是,读取是通过在代码中内联一些汇编指令来完成的。根据底层架构,读取成本在 ~11(AMD) 和 ~33(Intel) tsc之间变化。使用 1 Ghz CPU,您几乎可以达到纳秒级的精度。

为了对一段代码执行可靠且非侵入性的测量,您可以:

  • 通过禁用AMD Cool'n PrettyIntel SpeedStep等 CPU 功能来防止 CPU 缩放频率。
  • 重复测试几次,将测量结果收集到数组中,然后将数据保存到文件中以供离线分析。
  • 为被测进程选择实时调度策略,例如SHED_RRSHED_FIFO。实时策略减少了被测进程与其他被阻止的正常进程/内核线程之间的上下文切换次数。
  • 通过 mlockall() 系统调用锁定 RAM 中所有进程的虚拟地址空间。

在这里您可以找到我为 Linux 编写的准可移植 C++ 类,该类派生自 Linux 内核,旨在读取 i386、x86_64 和 ia64 架构的 tsc。