| Java und mehrdimensionale Arrays |
|
Wer viel mit Mehrdimensionalen Arrays programmiert, wird den Komfort zu schätzen wissen, den das bringt. Es gibt jedoch auch Szenarien, in denen deren Einsatz eher kontraproduktiv ist.
SubstituierbarkeitPrinzipiell jedes mehrdimensionale Array ist durch ein entsprechend dimensioniertes eindimensionales ersetzbar. In diesem Fall muß man lediglich selbst ein wenig Mathematik betreiben um immer die korrekten Indices zu bestimmen. Das bedeutet also, daß die beiden folgenden Arrayfestlegungen austauschbar sind: float[][][] f=new float[4096][4096][2]; und float[] f=new float[4096*4096*2]; Performance (Rechenleistung)Zunächst muß man feststellen, daß bei moderaten Größen des Arrays der Vorgang des Anlegens eine beträchtliche Zeitspanne in Anspruch nimmt. Das resultiert aus der Tatsache, daß hierbei zunächst das erste Array angelegt wird, anschließend wird in jedem einzelnen Element der ersten Dimension ein weiteres Array und in diesen Arrays wiederum neue Arrays angelegt. Das bedeutet, daß in unserem Beispiel 1+ 4096+ 4096*4096 (16781313) Arrays angelegt werden müssen. Jeder wird einsehen, daß der Computer hierfür Zeit benötigt. Performance (Ausnutzung des Arbeitsspeichers)Auch der Arbeitsspeicher wird bei der Arbeit mit mehrdimensionalen Arrays nicht besonders effizient ausgenutzt. Jedes der Arrays, die angelegt worden sind, sind Objekte (man erinnere sich zum Beispiel daran, dass die Indizes beim Zugriff kontrolliert werden...) und Objekte brauchen Daten um ihren Zustand zu beschreiben. Rein rechnerisch benötigt unser Beispiel im eindimensionalen Fall 4096*4096*2*4 Byte (Floats sind 4 Byte breit) und damit rund 135 MB. Der dreidimensionale Fall verbraucht unseren Tests zufolge pro Element in den Arrays (also pro Float) zwischen 17-24 Byte (genau kann die Messung nicht sein, da wir den Speicherverbrauch mit den Methoden der Klasse System gemessen haben, die wegen der fehlenden Abstimmung mit dem Garbage Collector nicht genau sein können. Der Gesamtbedarf an Arbeitsspeicher, der zur Ablage aller Elemente des dreidimensionalen Arrays aus dem Beispiel benötigt wird, beläuft sich auf über 640(!) MB. FazitMehrdimensionale Arrays sind in Java komfortabel, man sollte sich aber der Performancekosten großer mehrdimensionaler Arrays bewußt sein und diese Tatsache im Hinterkopf behalten, wenn bei der Performanceanalyse Flaschenhälse gesucht werden müssen. |


