关于c ++:如何测试计算机每秒可以执行的指令数量?

How can you test how many instructions per second your computer can do?

有没有一种快速/简单的方法可以做到这一点(至少是粗略估计)?

我是标杆算法,我认为知道我的计算机执行指令的绝对速度,并将它与我的渐近分析相比较是很酷的。


如果你想知道你的CPU能做什么,那么看看文档。CPU供应商指定所有指令的延迟和吞吐量,以及各种其他信息(每个周期可以发出或收回多少指令、缓存延迟等)。基于此,您可以计算理论峰值吞吐量。

如果你想做你的CPU实际正在做的,那么运行你自己的代码并测量它的性能。

然而,请记住,现代CPU是非常复杂的,它们的性能取决于各种各样的因素,而且您很少能够接近最大限度地利用您的CPU,并且理解为什么或什么阻碍了您的代码需要对硬件有一个相当透彻的了解。(我通常的经验法则是,如果理论峰值持续下跌30-40%,你会做得很好)


这是一个典型的"理论上、理论上和实践上是一样的,实践上却不是"。

现代的CPU有非常复杂的逻辑,这意味着实际执行的操作数量不同于你仅仅看代码或思考问题时的想法(除非你有一个小星球大小的大脑,并且知道特定的CPU是如何工作的)。例如,处理器可能会推测性地在分支的一个或另一个端执行指令,即使它还没有完全到达分支——如果这是"错误的"端,那么它将丢弃这些指令的结果——当然,执行它们需要时间。

指令执行顺序也不正常,这意味着很难准确预测何时执行哪个指令。也有一些例外。

如果您同时通过所有可用的执行单元推送数据和指令,您将只能(接近)获得理论吞吐量——这意味着拥有正确的指令组合,当然还有缓存中的所有代码和数据。

因此,从理论上讲,我们可以通过编写非常聪明的代码,让处理器充满可以使其最大化的指令。实际上,这很快就变成了一项艰巨的任务。

然而,问题在于如何测量指令的吞吐量,而在现代CPU上,使用正确的额外软件是非常可能的。在LinuxPerftool或Oprofile上,对于Windows,有英特尔的vtune和AMD的代码分析师。这些将允许您(受限于足够的特权)获取处理器中的"性能计数器",它具有"指令数"、"浮点运算数"、"缓存未命中数"、"分支预测失误"和许多其他处理器性能度量的计数器。因此,如果有足够长的运行时间(至少几秒钟,最好更长),您可以测量处理器执行的实际计数或时钟周期。


在目前的实践中,指令的有效数量主要取决于内存延迟,这是性能的主要瓶颈。等待数据不好。处理器可以通过缓存、流水线和并发等技术稍微缓解这个问题,但是问题仍然存在,并且随着时间的推移只会变得更糟。

正确的实现可以产生巨大的差异。您可能想看看关于缓存友好代码的这个问题。


您可以在Linux中使用性能工具。它很容易使用。

要获取有关CPU周期、每个周期的指令(IPC)、缓存命中/未命中等的统计信息,只需使用perf运行程序。示例命令是

性能统计-d

有关详细信息,请访问http://www.brendangregg.com/perf.html或https://perf.wiki.kernel.org/index.php/tutorial。


现代的CPU都是流水线指令处理,因此没有常量。

但是,您可以在算法开始和结束时读取CPU计时周期数。我认为这是最低水平,你可以得到这样的测量。

http://en.wikipedia.org/wiki/time_stamp_counter网站

注意:这里有很多问题,为什么这不能100%准确,我可以说很少,但我相信社区将能够添加到列表中:-操作系统先发制人-缓存未命中(algo第一次运行速度较慢,如果随后运行则更快)-在较旧的CPU上,CPU计时周期与CPU频率无关。