连载:编写高效代码(12) 优化内存访问——别让包袱拖垮了你
来源:互联网 发布:免费下载播放软件 编辑:程序博客网 时间:2024/05/16 06:23
处理器运算的速度像兔子赛跑一样快,但是存储器的访问速度像乌龟走路一样慢,而且越是远离内核的存储器,访问速度越慢。
下面这个表是在几个x86处理器中,内核访问各级数据Cache和内存所需要的 Cycle数:
处理器
Level 1 data Cache
Level 2 data Cache
内存
P3
3
8
140
P4
2
19
350
PM(奔腾M)
3
10
80
Core2(酷睿)
3
14
185
Opteron(皓龙)
3
13
100
从这张表可以看出,从L1中访问数据速度还较快,但是仍然要慢于运算的速度,从L2中访问数据速度还能将就,从内存中访问数据就无法忍受了。我们应该尽量减少内存的访问,要访问,也要尽量避免Cache miss。
少使用数组,少使用指针
由于大块数据会被放在存储器中,简单局部变量才会被放在寄存器中,因此应该尽量少用数组、指针,多用简单局部变量。
下面这段程序,需要4次内存访问:
c = a[i] * b[i];
d = a[i] + b[i];
如果改成如下的形式,就只有两次内存访问了:
x = a[i];
y = b[i];
c = x * y;
d = x + y;
少用全局变量
全局变量因为要被多个模块使用,不会被放到寄存器中,局部变量才能被放在寄存器中,应尽量避免使用全局变量。下面这段程序:
int x;
int fun_a ()
{
int y, z;
y = x;
z = x + 1;
…
}
最好改为:
int x;
int fun_a ()
{
int y, z, temp;
temp = x;
y = temp;
z = temp + 1;
…
}
一次多访问一些数据
我们通常会有这样的生活常识,要去很远的地方,就会多带一些东西,要去近一点的地方,就会少带一些东西。既然数据访问速度较慢,我们就一次多访问些数据。处理器将这些为我们考虑到了,通常都提供了较大的数据带宽。
以C64 DSP为例,通常一条指令,一次对两个32bit的数据做处理,而它却1次可以访问两个64bit数据。
在DSP中,SIMD指令和普通指令共用寄存器,有些数据虽然不能用SIMD指令处理,我们也可以一次将内存中的多个数据搬入到寄存器中,用简单指令分别处理,当要存储时,将分散的寄存器组合在一个连续的位置,再将数据输出到内存中。由于操作寄存器远比操作存储器快,虽然多了些数据的拆分和组合的操作,代价还是值得的。
- 连载:编写高效代码(12) 优化内存访问——别让包袱拖垮了你
- 编写高效代码(12) 优化内存访问——别让包袱拖垮了你
- 编写高效代码(7) 优化内存访问——别让包袱拖垮了你
- 别让优化搅乱你的代码
- 连载:编写高效代码(1)—编写高效代码的意义
- 连载:编写高效代码(6)——降低数据精度
- 连载:编写高效代码(13) 数据对齐访问
- 连载:编写高效代码(8) 空间换时间——我们总是在走,却忘了停留
- 连载:编写高效代码(2)——代码剖析,没有调查,就没有发言权
- 连载:编写高效代码(3)——使用更快的算法
- 连载:编写高效代码(5)——选用合适的指令
- 连载:编写高效代码(7) 减少函数调用——不要老打断我
- 连载:编写高效代码(4)—算法领域的牛人们
- 连载:编写高效代码(14) 程序、数据访问符合Cache的时间、空间局部性
- 别让CDN的回源把你的服务器拖垮,采用正确的回源策略
- 别让店小二宠坏了你
- 别让MSDN忽悠了你
- 别让缺点限制了你
- 使用GDI绘画图片
- python 中得logging系统
- 两个Activity通信(一)
- Chukwa 0.4.0 详细安装流程
- C语言中比较难掌握的一些要点介绍
- 连载:编写高效代码(12) 优化内存访问——别让包袱拖垮了你
- C语言static关键字解析
- 计算指定时间与当前的时间差 比如,3天前、10分钟前
- UI组件1
- stl
- 以往的存储过程代码(部分)
- C++杂记 2011/12/13
- 异常抛出学习笔记ExceptionDemo2.java
- Andorid控件