优化程序性能
代码优化
消除循环的低效率
- 将循环中执行多次但是计算结果不会改变的部分;
- 移动至循环体前不会被多次求值的部分;
/* 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 语句;