1.【短】循环展开。
优点:1. 明显减少指令预测带来的开销
2.明确去掉一次错误的指令预测机会
3.少维护一个计数变量
缺点:指令变长,可能因为取指时间变长而失去性能优化。
使用:基于实际测试。一般用于短循环是有用处的。
2.指令选择:
做法采用移位,加法减法,而最末选择乘法除法。
一个除法的指令周期是加法的40倍。
如欧几里德法计算最大公约数,比除法快很多。
3.数据相关与指令并行。
应该给更多的机会让CPU有机会去并行执行代码。
如
for(i=0;i<10000;i++) sum+= a[i]
可以修改完
for(i=0;i<2500;i++)
{
s1 += a[i] ,s2 += a[i+1] ,s3+= a[i+2],s4 += a[i+3] ;
}
sum = s1+s2+s3+s4 ;
4.显式优化分支预测的机会,使分支更容易预测
比如,检查是否三个数全部为0:
if( t1==0 && t2==0 && t3==0 ) 可以修改为 :
if( ( t1 | t2 | t3 )==0 )
根据产生的随机数是奇还是偶来预测的话,前者每个分支都是0.5的预测正确率,很糟糕的分支预测
后者取真的概率是0.125,取假的概率是0.875,可以很好的预测
5.内存: