5.5循环展开
一种比较常见的优化程序算法,就是将一次循环展开多次,来减少循环的次数。
例如combine5:
void combine5(vec_ptr v, data_t *dest)
{
long int i;
long int length = vec_length(v);
long int limit = length - 1;
data_t *data = get_vec_start(v);
data_t acc = IDENT;
for(i = 0;i < limit;i+=2){
acc = (acc OP data[i]) OP data[i+1];
}
for(;i < length; i++){
acc = acc OP data[i];
}
*dest = acc;
}
性能如下:
本机测试:
test4_O0_add_int 0.001313
test5_O0_add_int 0.001048
test53_O0_add_int 0.000972
test54_O0_add_int 0.000920
这是书中给出的性能对比图。可以看到int类型的性能有明显的提升,而float类型没有提升,这是因为float类型在计算机里面不支持结合律造成的,下面会分析。
分析浮点运算没有性能提升的原因: