Ein cache für integer-werte

Ich habe in meinem leben schon eine menge komischen kohd anderer leute gesehen, und manchmal habe ich auch ein paar zeilen kohd von mir gegeben, die ich selbst niemals würde vorzeigen wollen, aber auf die gnadenlos kranke idee, einen „cache“ für integer-werte anzulegen bin ich noch nie gestoßen oder gekommen. Muss man eigentlich java programmieren, um dermaßen krank in seinem praktischen denken zu werden? Lernt man in dieser sprache erst die ganz komischen optimierungen? Weil eben nicht alles so performant ist, wie es Sun so gern behauptet? Oder ist man schon vorher ein bisschen krank im kopfe, wenn man sich entschließt, ein java-programmierer zu werden?

(Ja, ich weiß, dass es hier um die erzeugung von instanzen der klasse Integer geht, aber dabei wird wohl kein nennenswerter verlust an laufzeit oder speicherplatz entstehen. Das ist nur ein klassenwräpper um einen int, mehr nicht.)

4 Antworten zu “Ein cache für integer-werte

  1. Ich hatte einmal einen Kollegen, der einen Integerwert auf die Weise initialisierte, dass er ihn in einer Schleife von 0 bis zum gewünschten Wert inkrementierte.
    War ein hoch bezahlter freier Mitarbeiter und hat es voll ernst gemeint.
    Er wollte eigentlich Schauspieler werden.

  2. Java ist total performant, sobald die VM /endlich/ mal gestartet ist, und das mit seinem massiven Ressourcenproblem ist ja wieder was ganz anderes …

  3. Smalltalk, Python usw. machen das genauso (allerdings automatisch, d.h. man muss sich nicht selbst um die Unterschiede zwischen primitiven Typen und Boxing-Objektwrappern kümmern).

  4. Wie „Coder“ sagt, das ist eine absolute Standard-Optimierung in praktisch allen VM Sprachen mit Garbage Collection (und zwar egal welche VM). Die Java Standard-Bibliothek enthält auch entsprechenden Code in Integer.valueOf(int), und wenn man Autoboxing verwendet (also einfach „Integer x = 0“ schreibt) wird auch genau dieser Cache verwendet. Das ist zwar sehr low level, kann aber in einigen Fällen die GC deutlich entlasten und kostet ansonsten (praktisch) nichts.

    In vielen Smalltalk und LISP/Scheme Implementierungen werden übrigens die kleineren Integer-Objekte als „Tagged Pointer“ gespeichert. D.h. die ersten paar bit eines Pointers sind ein Tag, und ein bestimmter Wert des Tags sagt „dieser Wert ist ein direkter Integer“ – die niedrigwertigen Bits des Pointers sind dann die Zahl selber.

    Der Code ist also insofern krank als das jemand Standard-Sprachfunktionalität nachimplementiert, die sogar mit deutlich kürzerer Syntax daherkommt. Aber ansonsten ist das eine völlig legitime Optimierung.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google Foto

Du kommentierst mit Deinem Google-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.