Ich habe ein Projekt in Java angeschaut und eine for
-Schleife gefunden, die wie folgt geschrieben wurde:
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:
d. wie den Zugriff auf den Wert einer lokalen Variablen innerhalb der Funktion. Danke.
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.)
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").
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.
Für Ihre Bequemlichkeit, ich habe es microbenchmarked. Der Code:
%Vor%Die Ergebnisse:
%Vor%Zusammenfassung: keine erkennbare Änderung.
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
Tags und Links java arrays complexity-theory