Ich weiß, das ist von einiger Zeit, aber hier ist eine Implementierung einer Unterprozedur von Heapsort, in dem die Verwendung von registrieren Variablen der Algorithmus schneller macht, zumindest 4.5.2 mit gcc den Code
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;
}
}
}
ich die algortihm getestet zu kompilieren mit und w Ohne das Schlüsselwort register vor den Attributen und ausgeführt, um ein zufälliges Array mit 50.000.000 Elementen auf meinem Notebook ein paar Mal für jede Version zu sortieren.
Die Verwendung von Registern ließ die Heapsort-Zeit von ~ 135s auf ~ 125s fallen.
Ich habe auch nur mit 5.000.000 Elementen getestet, aber es mehrmals ausgeführt.
Die Version ohne das Register begann bei 11s aber jede Ausführung verringert sich die Zeit, bis er 9,65s erreicht und hielt es
die Version mit dem Register begann bei 10s und senkte die Zeit bis 8,80s.
Ich denke, es hat etwas mit dem Cache-Speicher zu tun. Nichtsdestoweniger scheint es, dass die Register den Algorithmus um einen Konstantenfaktor schneller machen. Da diese Variablen ziemlich häufig in dem Algorithmus verwendet werden, indem sichergestellt wird, dass sie auf dem Register sind, anstatt diese Arbeit dem Compiler zu überlassen, führte dies zu einem besseren Ergebnis Fall. Allerdings hat es die Zeit nicht so sehr verbessert.
Hoffentlich wird Thill für jemanden hilfreich sein, Grüße.
"Drei Dinge können passieren, und zwei sind schlecht"? Wo habe ich das schon mal gehört ... ;-) –
Denken Sie daran, dass der Compiler vollkommen frei ist, Ihren Vorschlag zu ignorieren - es gibt nichts im Standard zu sagen, dass er eine Registervariable in ein Register setzen muss. –
könnte auch der Fall sein, dass Sie ein Compiler-Backend schreiben und Sie sagen "Register" für alle Locals in einer Funktion wird eine stackless-Funktion machen. das wäre sehr nützlich, denke ich. –