今天用GCC做了几个小测试有一点发现,提供给大家参考。
现有两个变量
LONG A;
CHAR B;
1 需要进行如下运算:
A=A*16+B;
如果改用
A=(A<<4)+B;
到底那个快?
结果:A=(A<<4)+B;快一些。
原因:长整型乘法运算比较慢。
2 需要进行如下运算:
A=A*256+B;
如果改用
A=(A<<8)+B;
到底那个快?
结果:A=(A<<8)+B;快很多。
原因:在A=(A<<8)+B;中,程序自动将A的高三字节采用赋值传递,所以大量地节省了运算时间。
3 增加变量C,需要进行如下运算:
C=256;
A=A*C+B;
如果改用
C=8;
A=(A<<C)+B;
到底那个快?
结果:A=(A*256)+B;快。
原因:由于移位的位数保存在变量C中,程序无法采用针对性的优化,只得采用循环的逐位移动,造成移动位数多时速度降低。
结论
看起来不能简单地认为移位运算就比2的幂乘法快,还需要根据移位的多少来具体分析,乘数比较大时,移位次数增多,采用循环的逐位移动速度反而不高,而移位次数少时效率还可以,当移位次数为8或16时则可能获得最大的效率。
|