提升循环效率
int i;
char str[] = "hello!";
//低效版本
for (i = 0;i < strlen(str); ++i) {
;
}
//高效版本
int len = strlen(str);
for (i = 0;i < len; ++i) {
;
}
低效版本中每次循环都会调用strlen这个函数,随着字符串的增长,极大的拖慢程序运行速度
减少没必要内存引用
void accumalate(double *arr,double len,double *dst)
{
int i;
for (i = 0;i < len; ++i) {
*dst = *dst + arr[i];
}
}
void accumalate(double *arr,double len,double *dst)
{
int i;
double tmp = *dst;
for (i = 0;i < len; ++i) {
tmp = tmp + arr[i];
}
*dst = tmp;
}
第一版本的函数频繁读取内存,第二版本的先将结果放入局部变量中,暂存在寄存器,比频繁读取内存更快。
#优先使用条件赋值
//version 1
int i;
int sum = 0;
int arr[] = {1,2,3,4,5};
int len = 5;
for (i = 0;i < len; ++i) {
if (arr[i] > 10) {
sum += arr[i];
}
}
//version 2
int i;
int sum = 0;
int arr[] = {1,2,3,4,5};
int len = 5;
for (i = 0;i < len; ++i) {
sum = (arr[i] > 10) ? sum + arr[i] : sum;
}
版本一使用if 语句进行判断,如果分枝预测错误会减慢程序速度,而版本二的三目运算符则是整体评估表达式。
这种方法可以提升速度的原因就是汇编指令中有对应三目运算符的汇编语句,不会发送条件分支跳转。
利用内存局部性
//version 1
int i,j;
int sum = 0;
int arr[][] = {{1,2,3},{4,5,6},{7,8,9}};
for (i = 0;i < 3; ++i) {
for (j = 0;j < 3; ++j) {
sum += arr[i][j];
}
}
//version 2
int i,j;
int sum = 0;
int arr[][] = {{1,2,3},{4,5,6},{7,8,9}};
for (j = 0;i < 3; ++i) {
for (1 = 0;j < 3; ++j) {
sum += arr[i][j];
}
}
这种方法可以提升效率的原因是现在处理器读取内存时都会通过cache
cache缓存时会缓存访问内存的局部内存块,版本1读取时就可以利用这种可以,而版本二中会发生cache的更新和驱逐