对于归并排序的合并步骤的传统的实现需要三个循环[98]:
void merge(long src1[],long src2[],long dest[], long n) { long i1=0; long i2= 0; long id= 0; while (i1 <n&&i2<n){ if (src1[i1] < src2[i2]) dest [id++] = src1[i1++]; else dest [id++] = src2[i2++]; } while (i1 < n) dest[id++] = src1[i1++]; while (i2< n) dest [id++] = src2[i2++] ; }
对于把变量i1和i2与n做比较导致的分支,有很好的预测性能一唯一的预测错误发生在它们第一次变成错误时。另一方面,值src1[i1]和src2[i2]之间的比较(第6行),对于通常的数据来说,都是非常难以预测的。这个比较控制一个条件分支,运行在随机数据上时,得到的CPE大约为15. 0(这里元素的数量为2n)。
重写这段代码,使得可以用一个条件传送语句来实现第一个循环中条件语句(第6~9行)的功能。