跳到主要内容

优化程序性能

代码优化

消除循环的低效率

  • 将循环中执行多次但是计算结果不会改变的部分;
  • 移动至循环体前不会被多次求值的部分;
/* Move call to vec_length out of loop*/
void combine2(vec_ptr v, data_t*dest)
{
long i;
long length= vec_length(v);

*dest = IDENT;
for (i = O; i < length; i++) {
data_t val;
get_vec_element(v, i, &val);
*dest =*dest OP val;
}
}

消除不必要的内存引用

  • 减少各种数据类型的创建;
  • 使用临时变量保存中间结果;
  • 达到减少内存读写的次数;
void combine4(vec_ptr v, data_t*dest)
{
long i;
long length= vec_length(v);
data_t *data= get_vec_start(v);

data_t acc = !DENT;
for (i = O; i < length; i++) {
ace= ace OP data[i];
}
*dest = ace;
}

循环展开

  • 通过增加每次计算的元素数量;
  • 减少循环的迭代次数;
    • 减少索引计算,条件分支的操作;
/* 2x1 loopunrolling*/
void combine5(vec_ptr v,data_t*dest) {
long i;
long length = vec_length(v);
long limit= length-1;
data_t *data = get_vec_start(v);
data_t acc = IDENT;

/*Combine2 elements at at ime*/
for(i =O;i<limiti+=2){
acc = (acc OPdata[i]) OP data[i+i]
}

/* Finish any remaining elements */
for (;i<length;i++){
acc = acc OP data[i]; 3 *dest = acc;
}
}

分支预测和惩罚

  • if 条件尽量保持一致;
  • 使用 ?:操作符代替 if 语句;