it-swarm.com.de

Was ist ein gutes Beispiel für die Verwendung von Registervariablen in C?

Ich habe K & R durchgelesen und bin zu dem kleinen Abschnitt über Registervariablen gekommen. Ich habe mich gefragt, ob die Leute hier einige gute Beispiele für die praktische Umsetzung haben.

Aus Abschnitt 4.7 in K & R:

Die Registererklärung sieht so aus
register int x;
register char c;

Um es klar zu sagen, ich hoffe nur, ein paar coole Codebeispiele zu sehen. Ich (bin mir ziemlich sicher, dass ich das Thema verstehe), also habe ich nicht das Bedürfnis, eine ausführliche Erklärung einzugeben (es sei denn, Sie möchten).

29
Kyle Walsh

Es gibt kein gutes Beispiel für die Verwendung von Registern bei der Verwendung moderner Compiler (gelesen: über 15 Jahre), da sie fast nie etwas Gutes bewirken und etwas Schlechtes bewirken können. Wenn Sie register verwenden, sagen Sie dem Compiler "Ich weiß, wie ich meinen Code besser optimieren kann als Sie", was so gut wie nie der Fall ist. Eines von drei Dingen kann passieren, wenn Sie register verwenden:

  • Der Compiler ignoriert es, dies ist sehr wahrscheinlich. In diesem Fall besteht der einzige Schaden darin, dass Sie die Adresse der Variablen im Code nicht übernehmen können.
  • Der Compiler berücksichtigt Ihre Anfrage und der Code wird dadurch langsamer ausgeführt.
  • Der Compiler berücksichtigt Ihre Anforderung und der Code wird schneller ausgeführt. Dies ist das am wenigsten wahrscheinliche Szenario.

Selbst wenn ein Compiler bei Verwendung von register besseren Code erzeugt, gibt es keinen Grund zu der Annahme, dass ein anderer das Gleiche tut. Wenn Sie einen kritischen Code haben, den der Compiler nicht gut genug optimiert, ist es wahrscheinlich die beste Wahl, Assembler für diesen Teil zu verwenden, aber natürlich ist die entsprechende Profilerstellung, um zu überprüfen, ob der generierte Code wirklich ein Problem ist, zuerst.

66
Robert Gamble

Im Allgemeinen stimme ich Robert zu, aber als gute Regel hat diese auch Ausnahmen.
Wenn Sie auf einem tief eingebetteten System arbeiten, wissen Sie möglicherweise besser als der Compiler, wie Sie den Code für Ihre spezifische Anwendung auf Ihrer spezifischen Hardwarearchitektur optimieren können.

Aber in 99% der Fälle ist Roberts Erklärung auch für eingebettetes Word gut.

12
Ilya

Ich weiß, dass dies schon eine Weile her ist, aber hier ist eine Implementierung einer Unterprozedur von Heapsort, bei der die Verwendung von Registervariablen den Algorithmus beschleunigt, zumindest mit gcc 4.5.2, um den Code zu kompilieren

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 habe den Algorithmus mit und ohne das Schlüsselwort register vor den Attributen getestet und ausgeführt, um ein zufälliges Array mit 50.000.000 Elementen auf meinem Notizbuch zu sortieren, einige Male für jede Version.

durch die Verwendung von Registern wurde die Heapsort-Zeit von ~ 135s auf ~ 125s gesenkt.

Ich habe auch nur mit 5.000.000 Elementen getestet, es aber öfter ausgeführt.

Die Version ohne Register begann um 11 Sekunden, aber jede Ausführung verkürzte die Zeit, bis 9,65 Sekunden erreicht waren, und stoppte bei ihr

die Version mit dem Register begann um 10s und senkte die Zeit bis 8,80s.

Ich denke, es hat etwas mit dem Cache-Speicher zu tun. Trotzdem scheinen die Register den Algorithmus um einen konstanten Faktor zu beschleunigen

Da diese Variablen im Algorithmus häufig verwendet werden, führt dies zu einem besseren Ergebnis, wenn sichergestellt wird, dass sie sich im Register befinden, anstatt diese Arbeit dem Compiler zu überlassen. Die Zeit hat sich jedoch nicht wesentlich verbessert.

Hoffentlich hilft das jemandem, Grüße.

4
Rafael

Ein weiterer häufiger Fall ist die Implementierung von Dolmetschern auf niedriger Ebene. Halten Sie einen Zustand in Registern, z. Der Stack-Zeiger der virtuellen Maschine kann den Speicherzugriff erheblich reduzieren und Ihren Code beschleunigen.

Ein Beispiel für die Optimierung finden Sie unter vmgen - ein Generator für effiziente Interpreter für virtuelle Maschinen (5.2 Top-of-Stack-Caching).

3
Hrvoje Prgeša

erstens sollte die Registervariable für häufig verwendete Variablen wie z. B. Regelungsvariablen verwendet werden, um die Leistung durch Minimierung der Zugriffszeit zu verbessern. Sekundär können Sie nur verwenden und nur Speicherspezifizierer in dieser Situation registrieren, wie Spaß (Auto Int A, Auto Int B): Fehler Spaß (Register Int A, Register Int B): Richtig, nur dies würde Spaß (statisch Int A, statisch int b): Fehlerspaß (extern int a, extern int b): Fehler

1
Ashutosh Tiwari

Nun, dies ist eine Frage, die mehrere Antworten benötigt, da es mehrere Codierungszusammenhänge gibt: aus der Perspektive der Hochsprache, der Mittelstufe und der Niedrigstufe (bis hinunter zu Assembly), da die Sprache C Assembly-Routinen aufrufen kann.

Der Grund für die Verwendung von Assembly anstelle von C liegt ausschließlich in Leistungsproblemen während der Entwicklung. Soz ja, das Schlüsselwort register ist erforderlich, aber nein, es funktioniert in vielen Fällen nicht wie vom Entwickler beabsichtigt

0
yan bellavance