register [Variablenname]



  • Korhil schrieb:

    Aus deiner Aussage entnehme ich aber, das der Compiler meinen Wünschen entspricht, wenn es möglich ist, und in keinem Fall (?) schadhaft ist, oder ?

    ja, genau. allerdings kann ich mir schon vorstellen, dass einige schlechte compiler das keyword 'register' einfach ignorieren.
    🙂



  • Nein.

    Register ist eine Empfehlung an den Compiler, mehr nicht. Jeder moderne Compiler ignoriert register, weil er selber einfach viel besser optimieren kann als der Programmierer.

    Variablen als register zu deklarieren kann aber bei einem Compiler der register nicht ignoriert durchaus zu langsameren Code führen. Denn es gibt nur eine sehr begrenzte Anzahl an Registern und wenn man dann "falsche" Variablen in den Registern hält, fehlt der Platz für die Performance relevanten Werte.

    Deshalb: register nie verwenden, erst wenn der Profiler zeigt dass es Performanceprobleme gibt und man weiß dass der Compiler schlecht optimiert - dann kann man register sehr zaghaft zu verwenden beginnen.



  • @Shade of Mine
    naja, wenige Register ist ja ein Problem das von der Architektur abhängt. Aber gerade beim Register Mapping sind Compiler nicht sehr gut. Ich kann mir vorstellen, dass auf Architekturen mit wenig Registern (zB x86) es durchaus nützlich sein kann dem Compiler mitzuteilen, dass er eine bestimmte Variable doch bitte im Register behalten soll, weil man darauf eben viele Operationen anwendet.

    Ob der Compiler das dann am Ende durchzieht ist natürlich eine andere Frage.



  • Shade Of Mine schrieb:

    Jeder moderne Compiler ignoriert register, weil er selber einfach viel besser optimieren kann als der Programmierer.

    das würde ich mir als compiler-hersteller nicht anmassen wollen 😞



  • Shade Of Mine schrieb:

    Nein.

    Register ist eine Empfehlung an den Compiler, mehr nicht. Jeder moderne Compiler ignoriert register, weil er selber einfach viel besser optimieren kann als der Programmierer.

    Variablen als register zu deklarieren kann aber bei einem Compiler der register nicht ignoriert durchaus zu langsameren Code führen. Denn es gibt nur eine sehr begrenzte Anzahl an Registern und wenn man dann "falsche" Variablen in den Registern hält, fehlt der Platz für die Performance relevanten Werte.

    Deshalb: register nie verwenden, erst wenn der Profiler zeigt dass es Performanceprobleme gibt und man weiß dass der Compiler schlecht optimiert - dann kann man register sehr zaghaft zu verwenden beginnen.

    Ich kann aus meiner noch recht kurzen Arbeit mit C nur sagen, dass es bei der Berechnung von Primzahlen eine deutliche Leistungssteigerung gebracht hat. Hab diverse Verfahren auf ihre Dauer hin verglichen und bei mir lag das Verfahren mit Registerverwendung deutlich vor dem gleichen Verfahren ohne Register.



  • @Korhil

    Und welchen Compiler verwendest du nun?



  • Korhil schrieb:

    Ich kann aus meiner noch recht kurzen Arbeit mit C nur sagen, dass es bei der Berechnung von Primzahlen eine deutliche Leistungssteigerung gebracht hat. Hab diverse Verfahren auf ihre Dauer hin verglichen und bei mir lag das Verfahren mit Registerverwendung deutlich vor dem gleichen Verfahren ohne Register.

    die meisten C compiler haben optionen, mit denen man die codeerzeugung beeinflussen kann. z.b. ein 'optimize for speed' (guckst du compiler manual) bevorzugt schnellen code (zum nachteil der codegrösse), dann nimmt er register, wo er nur kann, löst schleifen auf usw... das solltest du vielleicht mal ausprobieren.
    🙂



  • Ich arbeite privat mit Dev-C++.



  • Korhil schrieb:

    Ich hatte eigentlich sehr gute Ergebnisse beim Einsatz von register in einem Primzahlenprogramm (deutlicher Geschwindigkeitsgewinn). War das jetzt bei mir Zufall oder ist register doch nicht so "überflüssig" wie in besagtem Tutorial geschreiben.

    Mal ganz naiv gefragt, hast du auch die Optimierung für den Compiler aktiviert? Gerade x86 Compiler können heutzutage in vielen Bereichen besser optimieren als durch manuellen Eingriff. Habe vor einiger Zeit selbst mal einen kleinen Test gemacht, deaktivierte Optimierung mit register und aktivierte Optimierung ohne register, und die Ergebnisse waren identisch. Ich würde daher eher von register abraten und sämtliche Optimierungen über Compiler Flags regeln.



  • Korhil schrieb:

    Ich arbeite privat mit Dev-C++.

    IMHO is das eine Entwicklungsumgebung, mit was wird Dev-C++ ausgeliefert, mingw+gcc?

    tt


Anmelden zum Antworten