4.1 优化程序的方法
消除循环的低效率
代码移动是程序优化的一种方法,包括识别要执行多次(在循环中)但是不会改变计算结果的计算,因而可以将计算移动到代码前面不会被多次求值的部分。例如将循环中strlen()函数的返回值赋给一个变量,就不用每次循环都执行一次strlen()操作。
减少过程调用
过程调用会带来开销,而且妨碍大多数形式的程序优化。
消除不必要的内存引用
例如某些代码会将运算的的值累积在指针指定的位置,而在每次迭代时,累积变量的数值都要从内存读出再写入内存,这样的读写很浪费,每次迭代开始时从指针位置读出的值就是上次迭代最后写入的值。为了消除不必要的内存读写,我们引入一个临时变量,它在循环中用来累积计算出来的值,只有在循环完成后结果才存放在指针位置中。就可以将每次迭代的内存操作从两次读一次写减少到一次读。
循环展开
循环展开是一种程序变换,通过每次增加迭代计算的元素的数量,减少循环的迭代次数。循环展开能从两个方面改进程序性能。首先,减少了不直接有助于程序结果的操作数量,例如循环索引计算和条件分支;其次,减少了整个计算中关键路径的操作数量。
把这个思想归纳为对一个循环按任意因子k进行展开,由此产生kX1循环展开。为此,上限设为n-k+1,在循环内对元素i到i+k-1应用合并运算。每次迭代,循环索引i加k。那么最大循环索引i+k-1会小于n。要使用第二个循环,以每次处理一个元素的方式处理向量的最后几个元素。这个循环体将会执行0~k-1次。对于k=2,我们能用一个简单的条件语句,可选地增加最后一次迭代。对于k>2,最后的这些情况最好用一个循环来表示。
浙公网安备 33010602011771号