Frage

Ich lese durch K & R und kam zu dem kleinen Abschnitt auf Registervariablen, und frage mich, ob die Leute hier einige gute Beispiele für diese in die Praxis umgesetzt haben.

Aus dem Bereich 4.7 in K & R:

  

Das Register Deklaration sieht wie
       registrieren int x;
       registrieren char c;

Um es klar, ich bin nur die Hoffnung ein paar coolen Codebeispiele zu sehen. Ich (bin mir ziemlich sicher, dass ich) zu verstehen, die den Gegenstand also nicht das Bedürfnis verspüren, eine ausführliche Erklärung geben up (es sei denn, Sie mögen).

War es hilfreich?

Lösung

Es gibt kein gutes Beispiel für Registernutzung, wenn moderne Compilern (sprich: letzten 15+ Jahre), weil es so gut wie nie etwas Gutes tut und kann einige schlechte tun. Wenn Sie sich registrieren verwenden, Sie sagen dem Compiler „Ich weiß, wie mein Code besser zu optimieren, als Sie tun“, was der Fall so gut wie nie ist. Einer der drei Dinge können passieren, wenn Sie Register verwenden:

  • Der Compiler ignoriert es, das ist am wahrscheinlichsten. In diesem Fall ist der einzige Schaden, dass Sie die Adresse der Variablen im Code erfolgen kann.
  • Der Compiler zeichnet Ihre Anfrage und als Ergebnis der Code ausgeführt wird langsamer.
  • Der Compiler zeichnet Ihre Anfrage und der Code schneller läuft, ist dies das am wenigsten wahrscheinliche Szenario ist.

Auch wenn man Compiler besseren Code erzeugt, wenn Sie sich registrieren verwenden, gibt es keinen Grund, eine andere zu glauben, wird das gleiche tun. Wenn Sie einen kritischen Code haben, dass der Compiler nicht gut genug, um die beste Wahl optimiert ist wahrscheinlich Assembler für den Teil ohnehin zu verwenden, aber natürlich tun, um die entsprechende Profilierung des generierte Code zu überprüfen ist wirklich ein Problem zuerst.

Andere Tipps

In der Regel i mit zustimmen Robert , aber wie jede gute Regel dieses Ausnahmen auch hat.
Wenn Sie auf tief verwurzelte System arbeiten könnte wissen Sie besser als Compiler, wie der Code für Ihre spezifische Anwendung auf Ihre spezifischen Hardware-Architektur zu optimieren.

Aber in 99% der Fälle Robert Erklärung gut für eingebettetes Wort als auch.

Ich weiß das aus geraumer Zeit ist, aber hier ist eine Implementierung einer Unterprozedur von Heapsort in denen die Verwendung von Registervariablen schneller den Algorithmus macht, zumindest 4.5.2 mit gcc 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;
        }
    }
}

Getestet habe ich die algortihm mit und ohne das Register Schlüsselwort vor den Attributen und ausgeführt mit 50.000.000 Elementen auf meinem Notebook ein zufälliges Array zu sortieren, ein paar Mal für jede Version.

die Verwendung von Registern ließ die Heapsort Zeit von ~ 135s auf ~ 125s.

ich auch nur mit 5.000.000 Elementen getestet, aber es ausgeführt mal.

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 bei 10s gestartet und abgesenkt, um die Zeit bis 8,80s.

Ich denke, es hat etwas mit dem Cache-Speicher zu tun. Dennoch scheint es, die Register der Algorithmus schneller durch einen constanct Faktor machen

Da diese Variablen sind ziemlich viel auf dem Algorithmus verwendet, um sicherzustellen, dass sie auf dem Register sind anstatt zu gehen, diese Arbeit an den Compiler zu einem besseren Ergebnis in diesem Fall geführt. Es ist jedoch nicht die Zeit verbessert, dass viel.

Hoffentlich wird thill hilfreich sein, um jemanden, Grüße.

Ein weiterer häufiger Fall ist, wenn Low-Level-Dolmetscher zu implementieren. Halten Sie einigen Zustand in den Registern, z. B. virtueller Maschine Stapelzeiger kann den Speicherzugriff erheblich reduzieren und Sie Code beschleunigen.

Siehe vmgen - ein Generator effizienter virtueller Maschine Dolmetscher für ein Beispiel für die Optimierung (5.2 Top of Stack-Caching).

ersten, registrieren Variable sollte Verwendung für stark frequentierten Variablen wie Schleifensteuerungsvariable seine Leistung zu verbessern, indem Zugriffszeit minimiert wird. Sekundär Sie können nur verwenden und nur Speicherbezeichnern in dieser Situation registrieren wie, Spaß (auto int a, auto int b): Fehler              fun (int ein Register, int b registrieren): Recht nur würde dies ausgeführt werden              fun (static int a, static int b): Fehler              fun (extern int a, extern int b): Fehler

Nun Dies ist eine Frage, die mehrere Antworten braucht, weil es mehrere Codierung contexes sind: von der Hochsprache Perspektive, in dem mittleren und niedrigem Niveau (bis zu assembly), da der C-Sprache kann die Montag Routinen aufrufe

.

Der Grund für die Montage anstelle von C verwendet, ist exavtly wegen Performance-Problemen während der Entwicklung soz begegnet ja gibt es einen Bedarf für das Register Schlüsselwort, aber nein, es funktioniert nicht wie von Entwickler bestimmt in vielen Fällen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top