Tôi biết điều này là từ một thời gian, nhưng đây là một triển khai thực hiện một subprocedure từ heapsort trong đó việc sử dụng đăng ký biến làm cho các thuật toán nhanh hơn, ít nhất là sử dụng gcc 4.5.2 để biên dịch mã
inline void max_heapify(int *H, int i){
char OK = FALSE;
register int l, r, max, hI;
while(!OK){
OK = TRUE;
l = left(i);
r = right(i);
max = i;
if(l <= H[SIZE] && H[l] > H[i]){
max = l;
}
if(r <= H[SIZE] && H[r] > H[max]){
max = r;
}
if(max != i){
OK = FALSE;
hI = H[i];
H[i] = H[max];
H[max] = hI;
i = max;
}
}
}
tôi đã thử nghiệm algortihm với và w ithout từ khóa đăng ký trước khi các thuộc tính và thực hiện nó để sắp xếp một mảng ngẫu nhiên với 50.000.000 yếu tố trên máy tính xách tay của tôi, một vài lần cho mỗi phiên bản.
việc sử dụng thanh ghi đã giảm thời gian heapsort từ ~ 135 xuống ~ 125 giây.
Tôi cũng đã thử nghiệm chỉ với 5.000.000 phần tử, nhưng thực thi nó nhiều lần hơn.
Phiên bản mà không đăng ký bắt đầu lúc 11s nhưng từng thực hiện giảm thời gian cho đến khi nó đạt 9,65s và dừng lại ở đó
phiên bản với đăng ký bắt đầu lúc 10s và giảm thời gian cho đến khi 8,80s.
Tôi nghĩ rằng nó có liên quan đến bộ nhớ cache. Tuy nhiên có vẻ như các thanh ghi làm cho thuật toán nhanh hơn bằng hệ số constanct
Vì các biến này được sử dụng khá nhiều trong thuật toán, bằng cách đảm bảo chúng nằm trong thanh ghi thay vì để công việc này cho trình biên dịch dẫn đến kết quả tốt hơn trường hợp. Tuy nhiên, nó đã không cải thiện thời gian nhiều.
Hy vọng rằng sẽ rất hữu ích cho ai đó, lời chúc mừng.
"Ba điều có thể xảy ra và hai điều xấu"? Nơi mà tôi đã nghe nói rằng trước khi ... ;-) –
Hãy nhớ rằng trình biên dịch là hoàn toàn miễn phí để bỏ qua đề xuất của bạn - không có gì trong tiêu chuẩn để nói rằng nó đã đặt một biến đăng ký trong một đăng ký. –
cũng có thể là trường hợp bạn viết trình biên dịch phụ trợ và bạn nói "đăng ký" cho tất cả người dân địa phương trong một hàm sẽ tạo ra một chức năng ngăn xếp. đó sẽ là khá hữu ích tôi nghĩ. –