有没有一种快速/简单的方法可以做到这一点(至少是粗略估计)?
我正在对算法进行基准测试,我认为知道我的计算机执行指令的绝对速度并将其与我的渐近分析进行比较会很酷。
如果您想知道您的CPU可以做什么,请查看文档。您的CPU供应商指定所有指令的延迟和吞吐量,以及各种其他信息(每个周期可以发出或失效的指令数量、缓存延迟等等)。基于此,您可以计算理论峰值吞吐量。
如果你想做你的CPU实际在做的事情,那么运行你自己的代码并测量它的性能。
然而,请记住,现代CPU是非常复杂的野兽,它们的性能取决于各种因素,而且您很少能够接近CPU的最大化,而要理解为什么,或者到底是什么阻碍了您的代码,需要对硬件有一个相当彻底的了解。(我通常的经验法则是,如果你得到理论峰值FLOPS的30-40%,你就做得很好)
这是"理论上理论和实践是一样的,实践中不是"的典型案例。
现代CPU有非常复杂的逻辑,这意味着实际执行的操作数量与你只看代码或思考问题时的想法不同[除非你有一个小星球大小的大脑,并且知道特定的CPU是如何工作的]。例如,处理器可能会推测性地在分支的一侧或另一侧执行指令,即使它还没有完全到达分支——如果那是"错误"的一侧,那么它会丢弃这些指令的结果——但执行它们当然需要时间。
指令也会无序执行,这意味着很难准确预测哪条指令将在何时执行。也有一些例外。
只有当你同时将数据和指令推送通过所有可用的执行单元时,你才能获得(接近)理论吞吐量——这意味着要有正确的指令组合,当然还有缓存中的所有代码和数据。
因此,从理论上讲,我们可以通过编写非常聪明的代码,在处理器中填充大量指令,使其达到极限。在实践中,这很快就变成了一项艰巨的任务。
然而,问题是关于测量指令的吞吐量,在现代CPU上,如果有合适的额外软件,这是非常可能的。在linux perftool或oprofile上,对于windows,有英特尔的VTune和AMD的代码分析师。这将允许您(拥有足够的特权)获取处理器中的"性能计数器",处理器中有"指令数"、"浮点运算数"、"缓存未命中数"、"分支预测错误"以及许多其他处理器性能测量值的计数器。因此,如果运行时间足够长(至少几秒钟,最好更长),您可以测量处理器执行的实际计数或时钟周期。
在目前的实践中,指令的有效数量主要取决于内存延迟,而内存延迟是性能的主要瓶颈。等待数据很糟糕。处理器可以通过缓存、流水线和并发等技术在一定程度上缓解这个问题,但这个问题仍然存在,而且只会随着时间的推移而变得更糟。
正确的实现可以产生巨大的差异。你可能想看看这个关于缓存友好代码的问题。
现代CPU都是流水线指令处理,因此没有这样的常量。
然而,你可以在算法开始和结束时读出CPU的滴答声。我认为这是通过这种测量可以达到的最低水平。
http://en.wikipedia.org/wiki/Time_Stamp_Counter
注意:为什么这不能100%准确,有很多问题,我可以说很少,但我相信社区将能够添加到列表中:-操作系统优先处理-缓存未命中(algo第一次运行时会较慢,如果随后运行则会较快)-在较旧的CPU上,CPU节拍对CPU频率不是不变的
您可以在Linux中使用Perf工具。它很容易使用。
要获得有关CPU周期、每个周期的指令(IPC)、缓存命中/未命中等的统计信息,只需使用Perf运行程序即可
性能统计-d <exename>
有关更多信息,请访问http://www.brendangregg.com/perf.html或https://perf.wiki.kernel.org/index.php/Tutorial