深入理解计算机系统第五章学习-性能优化 3

5.8分支预测

现在的处理都支持分支预测功能,在执行分支预测时候,在执行判断语句之前,处理器已经执行了判断后的语言,如果判断正确,就会直接把处理结果给执行单元,否则就会接受分支预测失败惩罚,如果预测比较容易预测,是可以很好提升其性能,如果分支判断确实是随机的话最好不要用这种方法。不过通常的情况下建议多运用分支预测预取技术。

GCC在判断是否运用分支预测预取技术的时候,会根据代码的风格判断,以下这种风格会用于分支预测预取技术:

void minmax2(int a[],int b[],int n)

int i;

for(i = 0;i

int min = a[i] < b[i] ? a[i] : b[i];

int max = a[i]

  a[i] = min;

b[i]=max;

}

 

不产生预测分支预取的代码:

void minmax1(int a[],int b[],int n)

int i;

for(i = 0;i

if(a[i] >b[i]){

int t=a[i];

    a[i]=b[i];

b[i]=t;

}

}

不是所有的条件行为都能用条件数据传送来实现,所以不可避免在某些情况下,程序员不能避免写出导致条件分支的代码,而对于这些条件分支,处理器用分支预测可能会处理得很糟糕。但是,程序员方面一点点聪明,有时候就能使得代码更容易被翻译成为条件数据传送。    

七、性能分析

确认和消除性能瓶颈。对大型程序而言,需要找到性能瓶颈,对于时间花费较多,资源占用较多的程序进行优化才更有意义。

Amdahl定律:

某个部分的占整个程序的时间比:ak为该程序提升的倍数,那么:


八、学习到优化方法

1.消除连续的函数调用。

2.尽量消除不必要的存储器引用。

3.展开循环。

4.使用多个累计变量和重新结合技术。

5.用功能的风格重新条件操作,使得编译采用条件数据传送。

 

利用gprofvalgrind等工具分析性能瓶颈,根据Amdahl定律找到程序中花费时间较多的地方,特别对于循环,利用寄存器流程图和解析汇编语言分析代码,并优化代码。

 

参考文献

深入理解计算机系统 第五章



你可能感兴趣的:(编码)