Zeit Komplexität oder versteckte Kosten von Array Name.length in Java

7

Ich habe ein Projekt in Java angeschaut und eine for -Schleife gefunden, die wie folgt geschrieben wurde:

%Vor%

Meine Frage ist: Ist es kostenintensiv, a.length zu berechnen (hier ist ein Array-Name)? Wenn nein, wie wird a.length intern berechnet (bedeutet, wie JVM dafür sorgt, dass O (1) darauf zugreift)? Ist ähnlich zu:

%Vor%

d. wie den Zugriff auf den Wert einer lokalen Variablen innerhalb der Funktion. Danke.

    
Trying 01.08.2013, 15:31
quelle

5 Antworten

10
  

Meine Frage ist: ist es teuer, die a.length

zu berechnen

Nein. Es ist nur ein Feld auf dem Array (siehe JLS Abschnitt 10.7 ). Es ist nicht teuer und die JVM weiß, dass es sich nie ändern wird und kann Schleifen entsprechend optimieren. (Tatsächlich würde ich erwarten, dass ein gutes JIT das normale Initialisierungsmuster einer Variablen mit einer nicht negativen Zahl erkennt, dass es kleiner als length ist und dann auf das Array zugreift - wenn es das bemerkt, kann es die Array-Grenze entfernen überprüfen.)

    
Jon Skeet 01.08.2013, 15:34
quelle
7

a.length ist keine Berechnung, sondern lediglich ein Zugriff auf ein Feld innerhalb des Arrays. Diese Art der Leseoperation ist super schnell.

Wenn der Code Teil einer Methode ist, die oft genug aufgerufen wird, ist es fast sicher, dass der JIT-Compiler die von Ihnen vorgeschlagene Optimierung durchführt, um ihn noch schneller zu machen.

Die mögliche Geschwindigkeitsdifferenz ist hier in Nanosekunden (wahrscheinlich ohne ein "s").

    
assylias 01.08.2013 15:34
quelle
4

in Java-Arrays sind behoben. Sobald Sie es deklariert haben, können Sie die Größe dieses Arrays im Speicher nicht ändern (wenn Sie versucht haben, die Array-Größe zu ändern, wird ein neues Array im Speicher erstellt).

Aus diesem Grund erhalten wir eine O (1) -Längensuche. Wie wir die Gesamtgröße im Speicher des Arrays kennen. Wenn wir auch die Größe im Speicher des ersten Index nachschlagen, können wir eine schnelle Berechnung durchführen, um die Länge bei O (1) Geschwindigkeit zu erhalten. Unabhängig davon, wie groß unser Array ist, benötigt es genauso viel Zeit, um die Größe im Speicher nachzuschlagen und die Größe des ersten Index nachzuschlagen.

    
zidsal 01.08.2013 15:34
quelle
3

Für Ihre Bequemlichkeit, ich habe es microbenchmarked. Der Code:

%Vor%

Die Ergebnisse:

%Vor%

Zusammenfassung: keine erkennbare Änderung.

    
Marko Topolnik 01.08.2013 16:05
quelle
2

In einem Array ist length keine Funktion wie in List.size() . Wenn Sie ein Array in Java erstellen, ist seine Länge eine Konstante. So sind die Kosten minimal

    
Pablo Lozano 01.08.2013 15:36
quelle

Tags und Links