我一直在尝试通过循环展开来优化一些对性能至关重要的代码(一种在蒙特卡罗模拟中被调用数百万次的快速排序算法)。这是我试图加速的内部循环:
// Search for elements to swap.
while(myArray[++index1] < pivot) {}
while(pivot < myArray[--index2]) {}
我尝试展开到类似的内容:
while(true) {
if(myArray[++index1] < pivot) break;
if(myArray[++index1] < pivot) break;
// More unrolling
}
while(true) {
if(pivot < myArray[--index2]) break;
if(pivot < myArray[--index2]) break;
// More unrolling
}
这完全没有区别,所以我把它改回更易读的形式。其他时候我也有过类似的经历,我尝试过循环展开。考虑到现代硬件上分支预测器的质量,循环展开何时(如果有的话)仍然是一种有用的优化?