C++ 性能优化篇二《影响优化的计算机行为》

撒谎,即讲述美丽而不真实的故事,乃是艺术的真正目的。

​ ——奥斯卡 • 王尔德,“谎言的衰朽”,《意图集》,1891 年

本篇的目的是为大家提供与优化技术相关的计算机硬件的最基本的背景知识,这样大家就不必疯狂地研究那 处理器手册了。本篇我们将简单地了解处理器的体系结构,从中获得性能优化的启发。虽然本篇中的信息非常重要且实用,但迫不及待地想学习优化技术的读者可以先跳过本篇,当在后面的篇节中遇到本篇中的知识时再回过头来学习。

如今所使用的微处理器设备的种类多样,从只有几千个逻辑门且时钟频率低于 1MHz 的价 值 1 美元的嵌入式设备,到有数十亿逻辑门且时钟频率达到千兆赫兹级别的桌面级设备。 一台包含数千个独立执行单元的大型计算机的尺寸可以与一个大房间相当,它消耗的电力足够点亮一座小城市中所有的电灯。这很容易让人误以为这些种类繁多的计算设备之间的联系不具有一般性。 但事实上,它们之间是有可利用的相似点的。毕竟,如果没有任何相 似点的话,编译器就无法为这么多处理器编译 C++ 代码了。

所有这些被广泛使用的计算机都会执行存储在内存中的指令。指令所操作的数据也是存储在内存中的。**内存被分为许多小的字(word),这些字由若干位(bit)组成。**其中一小部分宝贵的内存字是寄存器(register),它们的名字被直接定义在机器指令中。其他绝大多数内存字则都是以数值型的地址(address)命名的。每台计算机中都有一个特殊的寄存器保存着下一条待执行的指令的地址。如果将内存看作一本书,那么执行地址(execution address)就相当于指向要阅读的下一个单词的手指。执行单元(execution unit,也被称为处理器、核心、CPU、运算器等其他名字)从内存中读取指令流,然后执行它们。指令会告诉执行单元要从内存中读取(加载,取得)什么数据,如何处理数据, 以及将什么结果写入(存储、保存)到内存中。计算机是由遵守物理定律的设备组成的。

从内存地址读取数据和向内存地址写入数据是需要花费时间的,指令对数据进行操作也是需要花费时间的。

除了这条基本原则外,就如每个计算机专业新生都知道的,计算机体系结构的“族谱”也会不断地扩大。因为计算机体系结构是易变的,所以很难严格地测量出硬件行为在数值 的规律。现代处理器做了许多不同的、交互的事情来提高指令执行速度,导致指令的执行时间实际上变得难以确定。还有一个问题是,许多开发人员甚至无法准确地知道他们的代 码会运行在什么处理器上,多数情况下只能用试探法。

2.1 C++所相信的计算机谎言

当然,C++ 程序至少会假装相信上节中讲解过的简单的计算机基本模型中的一个版本。其中有可以以固定字符长度的字节为单位寻址,在本质上容量是无限的内存。有一个与其他任何有效的内存地址都不同的特殊的地址,叫作 nullptr。整数 0 会被转换为 nullptr,尽管在地址 0 上不需要 nullptr。有一个概念上的执行地址指向正在被执行的源代码语句。 各条语句会按照编写顺序执行,受到 C++ 控制流程语句的控制。

  • C++ 知道计算机远比这个简单模型要复杂。它在这台闪闪发亮的机器下提供了一些快速功能。
  • C++ 程序只需要表现得好像语句是按照顺序执行的。C++ 编译器和计算机自身只要能够确保每次计算的含义都不会改变,就可以改变执行顺序使程序运行得更快。
  • 自 C++11 开始,C++ 不再认为只有一个执行地址。C++ 标准库现在支持启动和终止线 程以及同步线程间的内存访问。在C++11之前,程序员对C++编译器隐瞒了他们的线程, 有时候这会导致难以调试。 • 某些内存地址可能是设备寄存器,而不是普通内存。这些地址的值可能会在同一个 线程对该地址的两次连续读的间隔发生变化,这表示硬件发生了变化。在 C++ 中用 volatile 关键字定义这些地址。声明一个 volatile 变量会要求编译器在每次使用该变 量时都获取它的一份新的副本,而不用通过将该变量的值保存在一个寄存器中并复用它 来优化程序。另外,也可以声明指向 volatile 内存的指针。
  • C++11 提供了一个名为 std::atomic<> 的特性,可以让内存在一段短暂的时间内表现得 仿佛是字节的简单线性存储一样,这样可以远离所有现代处理器的复杂性,包括多线程 执行、多层高速缓存等。有些开发人员误以为这与 volatile 是一样的,其实他们错了。

操作系统也欺骗了程序和用户。实际上,操作系统的目的就是为了给每个程序讲一个让它们信服的谎言。最重要的谎言之一是,操作系统希望每个程序都相信它们是独立运行于计算机上的,而且这些计算机的内存是无限的,还有无限的处理器来运行程序的所有线程。

操作系统会使用计算机硬件来隐藏这些谎言,这样 C++ 不得不相信它们。除了降低程序的运 行速

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值