Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1556307
  • 博文数量: 290
  • 博客积分: 3468
  • 博客等级: 中校
  • 技术积分: 3461
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-28 22:21
文章分类

全部博文(290)

文章存档

2016年(13)

2015年(3)

2014年(42)

2013年(67)

2012年(90)

2011年(75)

分类: 嵌入式

2013-11-22 14:06:51

1. 减少循环次数
a.
long n = 10000000000;
do {
a += 10;
} while (--n > 0);


b.
long n = 1000000000
do {
a += 10;
a += 10;
a += 10;
a += 10;
a += 10;
a += 10;
a += 10;
a += 10;
a += 10;
a += 10;
a += 10;
} while (--n > 0);


a. 加法 10亿次 循环 10亿次
b. 加法 10亿次 循环 1 亿次


2. 展开循环采用并行计算
现在CPU 一般都几个运算器(加/减/乘/除 法器)及 ALU(逻辑运算器)
a. 
int n = 10000;
do {
a += 10;
} while (--n > 0);


b. 
int n = 2500;


do {
a += 10;
b += 10;
c += 10;
d += 10;
} while(--n > 0);


a. 加法 10000 次, 循环 10000次
b. 加法 10000 次, 循环 2500次, 并且可以并行计算




3.  if/else 分支
I. if中应采用判断条件执行结果多为真的条件;因为条件为假时要跳转更耗时。
II. 采用不带 else 分支的判断比有 else 的要快。因为有else 的不管条件是否成立都要跳转
a.
if (n > 0) n++;
b.
if (n < 0) n++;


在a和b中,若 n > 0 的概率大时。a 的效率比b 高
4. 用位移与加减法代替乘除法
I. 用位移与加减法代替乘法
a. 
int c = 4;
int m = x * c;


b. 
int m = x << 2;


b比a 运行快。若 c 为奇数(3,5,9)则将n 转成 2^n + 1。 如 
int m = x * 5; 可转成 int m = x << 2 + x;


II.用位移与加减法代替除法


a.
int c = 4;
int m = x / c;


b.
int m = x >> 2;


ps. m为正数,若m为负数需要补正
b比a 运行快。




5. 采用寄存器变量
用register 声明变量
因为从寄存器中取数比从内存中快多了。


6. 利用高速缓存 
在用数组存取大数据时,每存取的数据量最好与cpu 的缓块大小相同(一般为32KB),以增加cache命中率。


参考:

阅读(1475) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~