你如何测试你的电脑每秒能执行多少指令
How can you test how many instructions per second your computer can do?
有没有一种快速/简单的方法可以做到这一点(至少是粗略估计)?
我正在对算法进行基准测试,我认为知道我的计算机执行指令的绝对速度并将其与我的渐近分析进行比较会很酷。
如果您想知道您的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
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 执行函数时导致崩溃的变量
- 无论条件是否为true,if总是在c++中执行
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 在给定时间段内,线程执行的指令数量是否有最小数量?
- 睡眠线程或进程的指令是否在线程/进程休眠时继续执行?
- 计算执行的 c++ 指令
- 我需要制作多个可执行文件来针对不同的指令集吗
- C++ 在特定地址执行指令后返回寄存器的值
- 你如何测试你的电脑每秒能执行多少指令
- 测量时间以执行简单的指令
- 为什么在第三个文件之前写入两个文件,即使指令是每次迭代执行每个文件
- 为什么添加一条从未执行过的指令会导致我的代码性能下降
- 如何对模板中的字符串数据类型执行几组不同的指令
- 从C/ c++代码执行RDMSR和WRMSR指令