我们先看一个例子:
有这么两个程序:它们的目的就是将数组x中的数,按照下标累加到数组y中,最后在把数组y中的数据累加到一个数dest里面。为了验证效果,我们将这个过程重复10000遍。
prog 1 prog2
这两个程序的区别就在prog2中红框里面的内容。那么哪个程序运行的更快呢?
话不多说,我们看实际的结果:
这里为了说明效果,我们编译的时候,并没有采用优化(编译优化,确实可以提高程序运行的效率,但是过高的编译优化等级会有一定的副作用,另外编译器优化也具有一定的局限性,高效的代码仍然应该是我们追求的目标)。可以看到,prog2要明显比prog1快。
要想理解上面的例子,我们必须先介绍一下寄存器和汇编代码的相关知识:
寄存器
cpu内部用来存放数据的一些小型存储区域, 注意寄存器是在cpu内部,受限于cpu的物理尺寸,寄存器数量不会太多。我们只需要记住两点:
1) 寄存器和cpu的l1 cache相比,速度虽然还在一个数量级,但是l1 cache的访问速度还是要慢几倍。具体的数据见下文表2
2) cpu只能从寄存器直接取数据或者指令,如果取不到,获取的顺序是l1-》l2-》l3-》主存-》磁盘。
从下文表2中可以看出,如果cpu的cache访问miss了,性能损失还是很大的。如果内存里面再miss了,那对性能来说不亚于一场灾难了。
计算机访问速度分级:
表1 时间单位
以3.3ghz的cpu为例:
表2 系统的各种延时
正如你所见,cpu周期的时间非常短,这段时间,光的速度大约只能走0.5米。想象一下,是不是非常震撼?
x86-64 cpu的整数寄存器:
我们无需刻意去记住这些寄存器的名称,不同架构的寄存器的数量和名称也不一样,我们只要知道他们是cpu内部的效率极高的存储单元即可。
回到前面的例子,为什么prog2要比prog1快,是因为prog2里面用dest这个局部变量代替了dest。dest是一个局部变量,在汇编指令里是直接访问寄存器,而dest则需要去访问内存cache。
苹果首个自动驾驶专利 可每秒60次更新路况并避障
开关电源Y电容怎么计算 大牛工程师告诉你
对可穿戴设备至关重要的MCU应该如何选取
博世2018年上海宝马展上展出了多款应用于行走机械行业的智能化和个性化产品
e络盟现货发售Advanced Energy的Excelsys电源
访问寄存器代替内存引用
美国XNUO心诺:传统医疗行业的品牌心智转型
钛度TSG305定制款鼠标评测 颜值不用说舒适度也非常棒
未来苹果和特斯拉将在汽车市场形成竞争
电气火灾监控系统的构成
数控机床领域的“铿锵玫瑰” 盖立亚又将迎来新的机遇和挑战
中兴高能8GWh动力电池项目一期规划已落实并试投产
MCU之间通信的主要方式
一种改进的流水线级运放共享电路设计
二线/三线/四线对讲电话电路图
对汽车尾气进行处理的尿素喷射系统中压力传感器有什么重要作用?
汽车发动机cvvt、dvvt、vvt、VVT-i都是什么意思?
处理器封装“胶水”技术再度兴盛 封装技术的立体演进
HD600电容电桥测试仪接线方法
人工智能在网络技术中的应用有哪些呢?