我一直试图通过循环展开来优化一些性能极其关键的代码(一种在蒙特卡洛模拟中被调用了成千上万次的快速排序算法)。下面是我试图加快的内部循环:
// 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
}
这完全没有区别,所以我把它改回了更易读的形式。我有过类似的经历,其他时候我也尝试过循环展开。鉴于现代硬件上分支预测器的质量,循环展开是否仍然是一种有用的优化?