Tôi đã cố gắng tối ưu hóa một số mã cực kỳ hiệu suất cực kỳ quan trọng (một thuật toán sắp xếp nhanh được gọi là hàng triệu và hàng triệu lần bên trong mô phỏng monte carlo) bằng cách bỏ vòng lặp. Dưới đây là vòng lặp bên trong tôi đang cố gắng để tăng tốc độ:Khi nào, nếu bao giờ, việc bỏ vòng lặp vẫn hữu ích?
// Search for elements to swap.
while(myArray[++index1] < pivot) {}
while(pivot < myArray[--index2]) {}
tôi đã cố gắng để unrolling cái gì đó như:
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
}
Điều này làm hoàn toàn không có sự khác biệt vì vậy tôi đã thay đổi nó trở lại dưới hình thức dễ đọc hơn. Tôi đã có những trải nghiệm tương tự vào những lúc khác tôi đã cố gắng bỏ vòng lặp. Với chất lượng của các yếu tố dự báo chi nhánh trên phần cứng hiện đại, khi nào, nếu có, thì việc bỏ vòng lặp vẫn là một tối ưu hóa hữu ích?
Tôi có thể hỏi tại sao bạn không sử dụng các thói quen quicksort thư viện chuẩn? –
@Poita: Bởi vì tôi có một số tính năng bổ sung mà tôi cần cho các tính toán thống kê mà tôi đang thực hiện và được điều chỉnh rất cao cho các trường hợp sử dụng của mình và do đó ít tổng quát hơn nhưng có thể đo nhanh hơn chuẩn lib. Tôi đang sử dụng ngôn ngữ lập trình D, trong đó có một trình tối ưu hóa crappy cũ, và cho mảng lớn của phao ngẫu nhiên, tôi vẫn đánh bại GCC của C + + STL sắp xếp bởi 10-20%. – dsimcha