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) |