Array

Network

Top Contributor
Hi,

ich hätte da mal eine Frage über das Array:
Läuft die Addressierung gleich ab wie bei normalen Variablen?

Genauer: Mein alter Informatiklehrer sagte mir in den Anfangsjahren bei einem Blick in meinen Quellcode, dass ich nicht ständig auf das Array in der For-Schleife zugreifen soll, wegen Geschwindigkeitseinbußen.
Das sah in etwa so aus:
Java:
for( int i = 0; i < a.length; i++ ) {
     a[i].sayHello();
     a[i].doSomething();
     a[i].voteQuimby();
}

Die Aussage kam mir jetzt wieder in den Kopf und die Frage ist, ob es stimmt.
Sollte man es wirklich lieber so machen:
Java:
for( int i = 0; i < a.length; i++ ) {
     Klasse ia = a[i];
     ia.sayHello();
     ia.doSomething();
     ia.voteQuimby();
}

Btw. ich weiss man kann die for-Schleife kürzer schreiben, aber das ist im Moment irrelevant.

Danke
Gruß
Net
 

XHelp

Top Contributor
Rein theoretisch betrachtet hat er nicht ganz unrecht, denn jedes mal, wenn du auf ein Array zugreifst, wird zunächst geprüft, ob der Index auch innerhalb der Länge des Arrays liegt (JLS 15.13.1), aber solche Überlegungen lassen sich heutzutage in Java oft vernachlässigen. Im Hintergrund werden so viele Sachen wegoptimiert, dass es durch aus sein kann, dass es auf der praktischen Ebene völlig egal ist.
Wenn man es ziemlich streng mit der Optimierung nimmt, müsste man die for-Schleife generell umschreiben:
Java:
int length = a.length; //damit nicht jedes mal abgefragt wird
for( int i = 0; i < length; i++ ) {
//oder überhaupt
for( int i = a.length; --i>=0;) {
Die letzte Variante ist semantisch nicht ganz die selbe, aber auf der theoretischer Ebene läuft die schneller ab, weil nativ der Vergleich mit 0 schneller abläuft. Praktisch gesehen ist das völlig irrelevant, weil die Schleifen von HotSpot optimiert werden.
 

faetzminator

Gesperrter Benutzer
Und genau genommen spielt das in diesem Fall auch keine Rolle, da du doch eher die for-each-Schleife verwenden würdest :) Aber ansonsten - wie immer: Mag interessant für ein Gespräch sein, jedoch in der Praxis absolut vernachlässigbar.
 

Network

Top Contributor
Vielen Dank!

Und genau genommen spielt das in diesem Fall auch keine Rolle, da du doch eher die for-each-Schleife verwenden würdest :)
Btw. ich weiss man kann die for-Schleife kürzer schreiben, aber das ist im Moment irrelevant.
;)

Hmm naja die For-Schleife war im Grunde nur ein Beispiel. Es muss ja nicht unbedingt eine Schleife sein. Das war jetzt der ungefähre Kontext zur Aussage...

Ein anderes Beispiel wäre, dass man ein Feld aus 42x42 (42 = keine Ahnung wieviele) Rechtecken hat, die untereinander jedoch nur auf Nachbarrechtecke zugreifen können - direkt angrenzend.

Man könnte die Nachbarrechtecke in einem ExtraArray oder einer ExtraListe speichern mit 4 Einträgen. Man könnte aber auch 4 Variablen verwenden.
Oder man entnimmt dem großen alles enthaltenem Array per IndexX +- 1 und IndexY +- 1 die Einträge.

Vieleicht ändert sich hier nochmal der Sachverhalt oder es ist weiterhin
. :D
 

XHelp

Top Contributor
Dein neues Beispiel hat verschiedene semantische Bedeutungen. Im "ExtraArray"-Fall muss eine Zelle seine Nachbaren selber kennen, in dem "ein Array"-Fall nicht.
Und so leicht lässt es sich nicht beantworten, denn so oder so musst du auf ein Array zugreifen und darüber hinaus musst du noch bei "ExtraArray"-Fall ja die Liste auch Synchron halten, so dass da der Aufwand größer ist.

Wie gesagt: Optimierung auf dieser Ebene ist nicht ganz einfach und vor allem nicht ganz sinnvoll. Du müsstest schon exakt wissen wie jede einzelne Aktion intern ausgewertet wird und vor allem was unter welchen Bedingungen zu was von dem Compiler/HotSpot optimiert wird.
 

Nardian

Bekanntes Mitglied
Hi,

meiner Erfahrung nach lohnt es sich ohnehin nicht sich über sowas ernsthaft Gedanken zu machen. die JVM ansich ist durchaus sehr mächtig, und solche beinahe "trivialen" Optimierungen sollten spätestens zur Laufzeit von der JVM selber gemacht werden.

Anderes Beispiel dafür wäre, ob man innerhalb einer Schleife eine neue Variable zum Arbeiten macht, oder außerhalb, und die Variable immer wieder überschreibt. Eigentlich würde letztes mehr Sinn machen, da nie ein neuer Speicherplatz gesucht werden muss, aber sowas müsste die JVM automatisch machen / optimieren können.

Lg
 

Schandro

Top Contributor
Alle Rechner die jemals diese Codestelle ausführen werden brauchen zusammen kürzer als die Zeit in der du darüber nachgedacht und diesen Thread geschrieben hast ;)
 

Network

Top Contributor
Alle Rechner die jemals diese Codestelle ausführen werden brauchen zusammen kürzer als die Zeit in der du darüber nachgedacht und diesen Thread geschrieben hast ;)

Das ist in der Regel mit jedem Stückchen Code so und hinzu noch der Grund warum wir heutzutage überhaupt so groß mit Rechenmaschinen arbeiteten. Mein Rechner braucht im Schnitt bei "Erstausführung" 21Nanosekunden um den Teil abzuhandeln. Ich müsste über den Teil nicht mehr als eine Sekunde nachgedacht haben und über 1000000000/20 leistungsgleiche Rechner müssten den Codeteil ausführen, damit deine Rechnung aufgeht.
Sorry aber Argument abgelehnt. :D
 

Schandro

Top Contributor
Mein Rechner braucht im Schnitt bei "Erstausführung" 21Nanosekunden um den Teil abzuhandeln. Ich müsste über den Teil nicht mehr als eine Sekunde nachgedacht haben und über 1000000000/20 leistungsgleiche Rechner müssten den Codeteil ausführen, damit deine Rechnung aufgeht.
Sorry aber Argument abgelehnt. :D
Ich bin ein bisschen verwirrt, so wie ich das sehe ist das Ergebnis deiner Rechnung das mein Argument IN BEZUG AUF DEINEN Code richtig ist. Natürlich würde ich nicht dasselbe statement machen wenn jemand über Performanceoptimierungen vom Kernel o.Ä. nachdenken würde ;)

Die Rechnung:
Gehirn braucht 1 Sekunde
durchschnittlicher PC braucht 21 nanosekunden

ergibt:
47.619.047 mal müsste die Codestelle ausgeführt werden, dann sind beide Zeiten gleich. Klingt für mich stark danach das meine These in dem Fall richtig ist, vorallem weil 1 Sekunde doch ein bisschen untertrieben ist ;)
 

Network

Top Contributor
Ich bin ein bisschen verwirrt, so wie ich das sehe ist das Ergebnis deiner Rechnung das mein Argument IN BEZUG AUF DEINEN Code richtig ist. Natürlich würde ich nicht dasselbe statement machen wenn jemand über Performanceoptimierungen vom Kernel o.Ä. nachdenken würde ;)

Die Rechnung:
Gehirn braucht 1 Sekunde
durchschnittlicher PC braucht 21 nanosekunden

ergibt:
47.619.047 mal müsste die Codestelle ausgeführt werden, dann sind beide Zeiten gleich. Klingt für mich stark danach das meine These in dem Fall richtig ist, vorallem weil 1 Sekunde doch ein bisschen untertrieben ist ;)

Ok führen wir das weiter :D
Ich habe ja auch nicht bewiesen dass deine These direkt falsch ist, sondern dass dein Argument keine Aussagekraft hat, da sie auf jeden Codeteil praktisch zutrifft und nicht nur auf diesen.
Wenn deine Argumentation ihre Wertigkeit hätte, hieße dass, das jeder Codebruchstück über den man länger nachdenkt als die Zeiten der Computer zusammengerechnet die ihn ausführen müssen es nicht Wert wäre was im Grunde jedem einzelnen entsprechen würde und man damit auch erst garnicht anfangen bräuchte darüber nachzudenken. :D
 

Schandro

Top Contributor
Ok führen wir das weiter :D
Ich habe ja auch nicht bewiesen dass deine These direkt falsch ist, sondern dass dein Argument keine Aussagekraft hat, da sie auf jeden Codeteil praktisch zutrifft und nicht nur auf diesen.
Wenn deine Argumentation ihre Wertigkeit hätte, hieße dass, das jeder Codebruchstück über den man länger nachdenkt als die Zeiten der Computer zusammengerechnet die ihn ausführen müssen es nicht Wert wäre was im Grunde jedem einzelnen entsprechen würde und man damit auch erst garnicht anfangen bräuchte darüber nachzudenken. :D
Es gibt schon ein paar Codestellen bei denen es lohnenswert ist über Performanceverbesserungen nachzudenken. Wenn man beispielsweise sieht das da ein Stream byte-weise eingelesen wird anstatt einen buffer zu benutzen oder extrem viele Strings concatenated werden anstatt nen StringBuilder zu nehmen, oder wenn man hunderte einzelne SQL-Statements an die DB schickt anstatt ein passendes join o.Ä. zu benutzen, um mal die einfachsten zu nennen. An solchen Stellen kostet das nachdenken fast immer weniger Zeit als wenn viele PC's so etwas ausführen müssen. ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Fynn29 Liste sortieren ohne Array und ohne vorgegebene Sortierung Allgemeine Java-Themen 24
LucasGlockner Effizienter byte-Zugriff auf ein long[]-Array Allgemeine Java-Themen 8
8u3631984 Frage Performance bei Linked List und Array List Allgemeine Java-Themen 5
M Queue mit einem Array implemetieren Allgemeine Java-Themen 16
M Array Rang eines Elements Allgemeine Java-Themen 4
TheSepp Java bestimmtes Array auf den Wert 0 setzen Allgemeine Java-Themen 32
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B HeapSort für Array of Strings funktioniert nur teilweise Allgemeine Java-Themen 3
noah1407 Array Allgemeine Java-Themen 3
D Methoden Teil-Array mit Maximalwert bestimmen Allgemeine Java-Themen 23
N einem Array Objekte hinzufügen die ihr Array position gespeichert haben Allgemeine Java-Themen 34
N zweidimensionalen Array in dreidimensionalen Array speichern Allgemeine Java-Themen 4
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
T Objekt Array Aufgabe mit Busdatenbank Allgemeine Java-Themen 2
L Array und Index Allgemeine Java-Themen 26
L die 3 größten Zahlen im Array Allgemeine Java-Themen 1
G jToggleButton in Array/ArrayList Allgemeine Java-Themen 12
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
Willi.We Array sortieren Allgemeine Java-Themen 5
gotzi242 Array Summe bestimmen tipps? Allgemeine Java-Themen 14
H Matrix ohne Array erstellen Allgemeine Java-Themen 9
Aboya Char Array rekursiv vergleichen Allgemeine Java-Themen 15
V4ll3.Wff Array in Java Allgemeine Java-Themen 4
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
H Array Sportschütze Allgemeine Java-Themen 6
Sumo_ow "ArrayIndexOutofBoundsException: 2" Array Problem Allgemeine Java-Themen 6
xGh0st2014 Problem mit Java Array Allgemeine Java-Themen 1
M Array verändern Allgemeine Java-Themen 1
A JavaFX 2 dimensionales array Allgemeine Java-Themen 1
LimDul Direktes return eines Array geht nicht Allgemeine Java-Themen 20
S Array dynamisieren oder ArrayList verwenden? Allgemeine Java-Themen 17
M Java 2D Array für ein Grid erstellen ? Allgemeine Java-Themen 2
H Array mit dem Datentype String[] initializieren Allgemeine Java-Themen 7
L ArrayList mit String Arrays in ein Array umwandeln Allgemeine Java-Themen 1
H Elemente aus ArrayList in Array speichern Allgemeine Java-Themen 8
E Datentypen Wie kann ich die Längen der unterschiedlichen Ebenen aus einem Objekt lesen von dem ich weiß, dass es ein mehrdimensionaler Array ist? Allgemeine Java-Themen 3
N Byte Array in Java "dekomprimieren" Allgemeine Java-Themen 3
parrot Array Aufgabe Allgemeine Java-Themen 3
N String Array Eingabe Allgemeine Java-Themen 6
R Warum wird mir in der Konsole das "Standard Array" ausgegeben? Allgemeine Java-Themen 2
N Variablen Array Länge ändern. Allgemeine Java-Themen 8
D Kgv aller Paare aus einem Array mit n integer berechnen Allgemeine Java-Themen 5
W Enumeration ein Array/List als Eigenschaft mitgeben - warum geht das nicht? Allgemeine Java-Themen 0
kodela Problem mit strukturiertem Array Allgemeine Java-Themen 18
A Array Problem Allgemeine Java-Themen 8
Drachenbauer Wie stelle ich fest, ob ein Objekt in meinem Array vorkommt? Allgemeine Java-Themen 5
F Datei in String-Array einlesen Allgemeine Java-Themen 8
L Objekt aus Objekt-array "löschen" Allgemeine Java-Themen 2
I Array Parameter mit 2 Klassen - NullPointerException Allgemeine Java-Themen 3
X Größten Werte in meinem Array löschen? Allgemeine Java-Themen 16
E Angabe wie groß Array sein soll und in for-schleifen diesen Array füllen Allgemeine Java-Themen 3
F 3 Dimensionales Array mit Allgemeine Java-Themen 9
M Steueralgorithmus verwandelt Array in Anfangszustand Allgemeine Java-Themen 9
W Array vs. ArrayList vs. HashMap Allgemeine Java-Themen 20
D Datentypen 2-3 Baum erstellen mit geordnetem int-array Allgemeine Java-Themen 0
T Objekt in Array packen Allgemeine Java-Themen 6
M Zahlen in Array anordnen Allgemeine Java-Themen 8
M Eclipse Unvollständigen Array ansteuern Allgemeine Java-Themen 2
D Erste Schritte Im Array Werte tauschen Allgemeine Java-Themen 5
Xge For/Array Error: IndexOutOfBounds Allgemeine Java-Themen 4
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
FRI3ND Datentypen Date-Array sortieren - Text mitnehmen? Allgemeine Java-Themen 7
D Integer-Array variabler Größe mit Zahlen befüllen (Schleifen) Allgemeine Java-Themen 0
J Variablen Array ertellen bei model.put Allgemeine Java-Themen 13
S Eindimensionales Array in zweidimensionales Array speichern Allgemeine Java-Themen 5
R convert 2d array list to 2d array Allgemeine Java-Themen 1
J json Array würfel Spalten durcheinander Allgemeine Java-Themen 9
MiMa Array umbau oder Alternative? Allgemeine Java-Themen 5
L Datentypen 3D Array Allgemeine Java-Themen 3
M 2D Array mit unterschiedlichen Längen erstellen und befüllen Allgemeine Java-Themen 11
Mario1409 Methoden JSON Array von URL Allgemeine Java-Themen 8
E Swing Array mit Bildern in GUI darstellen Allgemeine Java-Themen 2
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
H Zweidimensionales Array - Zellen der Tabelle verbinden Allgemeine Java-Themen 2
M Zweidimensionales Array mit Binärzahlen füllen Allgemeine Java-Themen 8
M Array aus Thread Objekten erstellen Allgemeine Java-Themen 2
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5
G Array ohne Aufzählungszeichen ausgeben Allgemeine Java-Themen 6
J Wie kann ich ein Java Array als Säulendiagramm ausgeben? Allgemeine Java-Themen 2
Z 2D Array Pixels reparieren Allgemeine Java-Themen 2
S Algorithmus welcher True-Werte in einem Array findet und auswertet. Allgemeine Java-Themen 5
B Polibios Array erweitern Allgemeine Java-Themen 1
R Index in einem Array löschen Allgemeine Java-Themen 10
R Index in einem Array löschen Allgemeine Java-Themen 2
U Methoden Algorithmus MergeSort String [ ] array sortieren programmieren Allgemeine Java-Themen 17
J Array-List Bubble-Sort Allgemeine Java-Themen 12
4 Variablen Int-Array Int Zuweisen Allgemeine Java-Themen 7
J Array Allgemeine Java-Themen 8
Z Array mit unterschiedlichen Werten Allgemeine Java-Themen 1
L sortiertes Array im main aufrufen klappt nicht. Allgemeine Java-Themen 3
O Mein JButton Array funktioniert nicht Allgemeine Java-Themen 3
A Mit dem letzten bis zum ersten Wert aus Array rechnen Allgemeine Java-Themen 15
A Vector Strings in Array splitten Allgemeine Java-Themen 6
I Muster in Array suchen Allgemeine Java-Themen 10
RalleYTN Datentypen Herausfinden ob Object ein Array ist ohne den Typen des Arrays zu kennen? Allgemeine Java-Themen 12
S Variablen String[] Array per schleife in int[] einlesen Allgemeine Java-Themen 8
B Zahlen manuell eingeben und in Array Speichern Allgemeine Java-Themen 2
R Wärmeleitung, 3d-Array Allgemeine Java-Themen 2
T Java Array in Methoden Allgemeine Java-Themen 1
D Erste Schritte Array von einer forschleife nach ausserhalb trasferieren Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben