CPU 怎么这么快

CPU 怎么这么快

我正在阅读一本 C 语言书,上面写着“编写一个从 1 数到 3 亿的程序,只有当它是 1 亿的倍数时才打印数字。用秒表来计时这个程序,很有趣!”

我并不是特别想计算时间,但如果不使用 GCC 进行任何优化,时间大约为 0.85 秒,而进行优化后,时间大约为该时间的一半。

处理器怎么会这么快?我猜它们使用了一些特殊的方式来计数(或者是 gcc 编译它的方式?),但它们是如何做到计数这么快的?

答案1

这很大程度上取决于您对“快”的定义。

3Ghz 处理器每秒有 30 亿个周期。每个周期可执行的指令数量取决于许多因素,包括指令集、内核、架构以及正在执行的任务。处理器经过精心设计和优化,可以在单个周期内执行尽可能多的任务。

但是,对于这个相当简单的任务,我们可以假设最坏的情况是每个周期只有一条指令。

那么问题就变成了“为什么数到 3 亿要花整整 0.85 秒?毕竟这是一个简单的增量,需要通过测试才能完成。它应该花费比这少得多的时间。

导致速度变慢的是周期性输出。输入/输出操作是这里的瓶颈,而且通常如此。输出一个简单数字所需的代码量比计数器大几个数量级,并且必须与 CPU 之外的子系统交互才能将信息显示在屏幕上。

取出您的打印件并查看其运行速度有多快。

答案2

1 GHz 处理器每秒能够执行 10 亿条指令(忽略超线程流水线多核和其他 CPU 功能,允许一次执行多条指令)。

增加计数器的指令只有 1 条指令,具体取决于您如何检查 1 亿以及 gcc 如何优化它,检查可能会减少到几个指令,这可能也是微不足道的,因为现代编译器具有前瞻/分支预测功能,这意味着您的 CPU 会假定该数字不是 1 亿的倍数,并将继续增加您的计数器,直到它得到实际比较的结果,如果是 1 亿的倍数,它将自行回滚到检查并执行您的打印语句,由于它需要处理 CPU 之外的硬件,因此速度会相当慢。

因此,增加打印次数会在两个方面减慢速度,1 它会更频繁地失败测试,​​但打印所花费的额外时间更为显著。

相关内容