【发布时间】:2011-01-21 21:29:44
【问题描述】:
我一直在尝试通过展开循环来优化一些对性能至关重要的代码(一种在蒙特卡罗模拟中被调用数百万次的快速排序算法)。这是我试图加速的内部循环:
// 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
}
这完全没有区别,所以我把它改回更易读的形式。其他时候我也有过类似的经历,我尝试过循环展开。考虑到现代硬件上分支预测器的质量,循环展开何时(如果有的话)仍然是一种有用的优化?
【问题讨论】:
-
请问您为什么不使用标准库快速排序例程?
-
@Poita:因为我有一些额外的功能,我需要进行统计计算,并且针对我的用例进行了高度调整,因此不太通用,但比标准库快得多。我使用的是 D 编程语言,它有一个旧的糟糕的优化器,对于大量的随机浮点数,我仍然比 GCC 的 C++ STL 排序高 10-20%。
标签: performance language-agnostic optimization micro-optimization