Wie groß ist der Overhead der Wrapperklassen?



  • Mich würde mal interessieren wie groß der Overhead der Wrapperklassen(Integer, Double) im Vergleich zu den einfachen Typen(int, double) ist. Ist dieser Overhead messbar, oder kann der Compiler diesen reduzieren?

    Liebe Grüsse



  • Ein int kostet 4 Byte.

    Ein Integer kostet:

    8 Byte Overhead, den jedes Objekt hat (Klassen-ID)
    4 Byte für internes int
    4 Byte pro Referenz auf das int

    Macht also 16 Byte.

    Allerdings ist die Frage, ob du lauter gleiche Integers benötigst, wenn du zum Beispiel 1000000 Integers/ints zwischen 0 und 256 oder so benötigst, dann kannst du immer die selben Integers nehmen. Im Großen und Ganzen hast du dann also auch nur 4 Byte pro Referenz, die für interessant sind.



  • Danke Gregor!

    Ich hatte mir so etwas schon gedacht, da ja Integer.intValue() nur eine Referenz auf einen int zurückliefert und diese "mehr Zuweisung" im Vergleich zum einfachen int müsste der Compiler ja zur Compilezeit schon ausradieren können.

    Ich finde einfach den Vorteil das die Wrapperklassen auch null sein können echt interessant. 🙂

    Der von Dir angesprochenen Overhead ist ja auch mehr oder weniger nur Speicher.

    Liebe Grüsse



  • Die Sonja schrieb:

    Ich finde einfach den Vorteil das die Wrapperklassen auch null sein können echt interessant. 🙂

    Der von Dir angesprochenen Overhead ist ja auch mehr oder weniger nur Speicher.

    Vielleicht hast du mich falsch verstanden: Der Overhead ist enorm und äußert sich natürlich nicht nur im verbrauchten Speicher, sondern auch bei der Performance. Gerade wenn man viel rechnen muss, sollte man für nichts die Wrapper benutzen. Es ist auch nicht zu empfehlen, die Wrapper zu benutzen, um viele ints in einer Collection zu speichern.

    Die einzige Ausnahme ist, wie schon gesagt, der Fall, dass man viele gleiche ints abspeichern möchte. Hier kann man den Speicheroverhead umgehen, wenn man selbst darauf achtet. Dennoch wird es auch hier einen Einbruch bei der Performance geben.

    Wenn du viel rechnen mußt und mit Integer statt mit int arbeitest, dann wird dieser Programmteil sicherlich um einen Faktor >10 langsamer. Gleiches gilt für die anderen Wrapper.



  • Oh danke Gregor! Dann hatte ich Dich da etwas falsch verstanden. 🙄

    Ich habe im Prinzip nur das Problem, dass ich Entities aus unserer Datenbank in der Anwendung abbilden muss. Das Problem ist aber, dass ich bei einem normalen int nicht von anderen Klassen herausfinden kann ob der Wert in der Tabelle null war.

    Weißt Du vielleicht wie die Hersteller von EJB-Containern dieses Problem umgehen? Die müssen ja auch einfache Datentypen manchmal auf null prüfen.

    Danke! 🙂



  • wie willst du aber in einer container-klasse ints speichern?
    ArrayList<int> - das funktioniert ja nicht.
    oder lieg ich da jetzt falsch?



  • DEvent schrieb:

    wie willst du aber in einer container-klasse ints speichern?
    ArrayList<int> - das funktioniert ja nicht.
    oder lieg ich da jetzt falsch?

    Wenn man darauf angewiesen ist, primitive Datentypen abzuspeichern, dann sollte man sich eine entsprechende Containerklasse speziell für diesen Typ schreiben. Es gibt da auch entsprechende Bibliotheken, die solche Container zur Verfügung stellen und die man dafür benutzen kann. Ich habe allerdings gerade keine Namen im Kopf. Da mußt du also selbst mal ein bischen suchen.


Anmelden zum Antworten