[JAVA] Vergleichen Sie die Geschwindigkeit der for-Anweisung und der erweiterten for-Anweisung.

Einführung

Die erweiterte for-Anweisung ist schneller als die normale for-Anweisung, da sie Iterator verwendet! Jemand sagte mir, dass ich es so belassen habe, wie es war, ohne es zu überprüfen. Zu diesem Zeitpunkt habe ich beschlossen, es richtig zu untersuchen. Was ist, wenn es um die Geschichte geht, dass ein normaler Satz besser ist ... Ich denke, die Ära ist Stream, aber da meine Site Java 6 ist, muss ich meinen Junioren beibringen, wie man in Java 6 schreibt. ~~ Es liegt nicht daran, dass ich keinen Stream schreiben kann. ~~

Überprüfungsumgebung

ich schrieb es

Verifizierungs-Schlüssel

Als ich es bei ungefähr 100.000 gemacht habe, war der Wert zu klein, um ihn zu vergleichen, also habe ich ihn 10 Millionen Mal wiederholt.

Main.java


import java.util.ArrayList;
import java.util.List;

public class Main {

	public static void main(String[] args) {
		List<Integer> list = new ArrayList<>();
		for (int i = 0; i < 10000000; i++) {
			list.add(i);
		}

		//Start
		long start = System.currentTimeMillis();
		//10 Millionen Schleifen
		for (int i = 0; i < list.size(); i++) {
			int tmp = list.get(i);
		}
		//Ende
		long end = System.currentTimeMillis();
		System.out.println("zur Aussage: " + (end - start) + " ms");

		//Start
		start = System.currentTimeMillis();
		//10 Millionen Schleifen
		for (Integer i : list) {
			int tmp = i;
		}
		//Ende
		end = System.currentTimeMillis();
		System.out.println("Für Aussage erweitert: " + (end - start) + " ms");

	}

}

Prüfergebnis

Was ein Idiot ... Ich habe es mehrmals versucht, aber die erweiterte for-Anweisung wurde nicht schneller.

zur Aussage: 24 ms
Für Aussage erweitert: 29 ms

Überprüfung ②

Als ich untersuchte, dass es nicht so enden würde, wie es ist, gab es eine Site wie diese.

Grund für die Verwendung von erweitert für Aussage- [Seasar] Tagebuch von soichirooooo5

Wenn Sie sich den Link ansehen, lautet die Antwort, die Sie in diesem Artikel schreiben wollten: Es ist eine große Sache, also mache ich es bis zum Ende. Da die Überprüfung nur mit ArrayList erfolgt, werde ich auch mit Array und LinkedList überprüfen.

Bestätigungscode (Array)

Main.java


public class Main {

	public static void main(String[] args) {
		int[] array = new int[10000000];
		for (int i = 0; i < 10000000; i++) {
			array[i] = i;
		}

		//Start
		long start = System.currentTimeMillis();
		//10 Millionen Schleifen
		for (int i = 0; i < array.length; i++) {
			int tmp = array[i];
		}
		//Ende
		long end = System.currentTimeMillis();
		System.out.println("zur Aussage: " + (end - start) + " ms");

		//Start
		start = System.currentTimeMillis();
		//10 Millionen Schleifen
		for (int i : array) {
			int tmp = i;
		}
		//Ende
		end = System.currentTimeMillis();
		System.out.println("Für Aussage erweitert: " + (end - start) + " ms");

	}

}

Ergebnis

~~ für Satz zu schnell www ~~ Weil Autoboxing in der erweiterten for-Anweisung durchgeführt wurde Ich konnte es nicht genau messen. Das Ergebnis bleibt gleich.

zur Aussage: 3 ms
Für Aussage erweitert: 3 ms

Überprüfung (LinkedList)

Main.java


package qiita;

import java.util.LinkedList;
import java.util.List;

public class Main {

	public static void main(String[] args) {
		List<Integer> list = new LinkedList<>();
		for (int i = 0; i < 10000000; i++) {
			list.add(i);
		}

		//Start
		long start = System.currentTimeMillis();
		//10 Millionen Schleifen
		for (int i = 0; i < list.size(); i++) {
			int tmp = list.get(i);
		}
		//Ende
		long end = System.currentTimeMillis();
		System.out.println("zur Aussage: " + (end - start) + " ms");

		//Start
		start = System.currentTimeMillis();
		//10 Millionen Schleifen
		for (Integer i : list) {
			int tmp = i;
		}
		//Ende
		end = System.currentTimeMillis();
		System.out.println("Für Aussage erweitert: " + (end - start) + " ms");

	}

}

Prüfergebnis

Ich habe seit ungefähr 5 Minuten keine Antwort mehr erhalten.

Überprüfung (LinkedList) ②

Da dies nicht endet, überprüfen Sie es erneut mit 100.000 Schleifen

Main.java


import java.util.LinkedList;
import java.util.List;

public class Main {

	public static void main(String[] args) {
		List<Integer> list = new LinkedList<>();
		for (int i = 0; i < 100000; i++) {
			list.add(i);
		}

		//Start
		long start = System.currentTimeMillis();
		//10 Millionen Schleifen
		for (int i = 0; i < list.size(); i++) {
			int tmp = list.get(i);
		}
		//Ende
		long end = System.currentTimeMillis();
		System.out.println("zur Aussage: " + (end - start) + " ms");

		//Start
		start = System.currentTimeMillis();
		//10 Millionen Schleifen
		for (Integer i : list) {
			int tmp = i;
		}
		//Ende
		end = System.currentTimeMillis();
		System.out.println("Für Aussage erweitert: " + (end - start) + " ms");

	}

}

Überprüfungsergebnis ②

es ist wunderbar! !!

zur Aussage: 5695 ms
Für Aussage erweitert: 36 ms

Schließlich

Es stellte sich heraus, dass die normale for-Anweisung für Dinge, die von vorne in der richtigen Reihenfolge ausgeführt werden, wie ArrayList und Arrays, schneller ist. Die verknüpfte Liste machte jedoch einen überwältigenden Unterschied. Es ist seltsam, sich beim Schleifen der List-Oberfläche um die Substanz zu kümmern, daher konnte ich zu dem Schluss kommen, dass die erweiterte for-Anweisung in Ordnung ist.

Das Folgende ist ein Zitat von der Referenzseite.

Wenn Sie die erweiterte for-Anweisung verwenden, müssen Sie sich keine Gedanken über "99% oder mehr Leistungseinbußen" machen, auch wenn Sie nicht wissen, ob das an die for-Anweisung übergebene Objekt ArrayList oder LinkedList ist.

Außerdem erweitert die erweiterte for-Anweisung den Implementierungstyp der List-Schnittstelle in Code, der einen Iterator verwendet, und konvertiert ihn im Fall eines Arrays in Code, der auf den Index zugreift.

Sie können sehen, dass diese Compilerübersetzung den entsprechenden Code für die Liste oder das Array generiert, die Sie an die for-Anweisung übergeben. Mit anderen Worten, wenn Sie Extended für verwenden, müssen Sie an nichts denken und sich um nichts kümmern. Wenn etwas schief geht, wird es etwas hinter der API tun.

Mit anderen Worten, Sie können die erweiterte for-Anweisung verwenden, ohne an irgendetwas zu denken. stream Lass uns studieren.

Recommended Posts

Vergleichen Sie die Geschwindigkeit der for-Anweisung und der erweiterten for-Anweisung.
Vergleich der Verarbeitungsgeschwindigkeit zwischen Stream einschließlich Cast und Extended for Statement
[Java] für Anweisung / erweitert für Anweisung
Ich habe versucht, die Geschwindigkeit von Graal VM mit JMH zu messen und zu vergleichen
Verwenden Sie doch die for-Anweisung? Verwenden Sie die while-Anweisung? Ordnungsgemäße Verwendung von for-Anweisung und while-Anweisung
[Für Anfänger] DI ~ Die Grundlagen von DI und DI im Frühjahr ~
Über für Anweisung und wenn Anweisung
[Java] Machen Sie die Variablen der erweiterten for-Anweisung und für jede Anweisung unveränderlich
Die Idee von C # (Lambda-Ausdruck, für Satz) zu kauen
Dies und das von JDK
Vergleichen Sie das Fahren ① und die beiden anderen Fahren
Verwendung von Java-Array-Elementen für, Länge, Wert und erweitert für Anweisungen
So erhalten Sie den Inhalt von Map mithilfe des for-Anweisungsmemorandums
Stellen Sie die Anzahl der Sekunden für den schnellen Vor- und Rücklauf in ExoPlayer ein
Ein- und Ausklappen des Inhalts der Recycler-Ansicht
Informationen zur Funktionsweise von next () und nextLine ()
Vergleichen Sie Elemente eines Arrays (Java)
darf nicht in der for-Anweisung zurückgegeben werden
[Einführung in Ruby] Über die Rolle von true und break in der while-Anweisung
[Java] Heutzutage ist die erweiterte for-Anweisung nicht ausschließlich für List, nicht wahr?
Bis Sie verstehen, dass die erweiterte for-Anweisung und die for-Anweisung mit Länge derselbe Prozess sind (behandeln Sie ein mehrdimensionales Array).
[Rails] Artikel für Anfänger, um den Fluss von form_with zu organisieren und zu verstehen
Referenzinformationen zur Untersuchung und Analyse des Speichernutzungsstatus von Tomcat
Überprüfen Sie die installierte und aktivierte JDK-Version
Denken Sie an die Kombination von Servlet und Ajax
Zellers Beamter (fragt nach dem Tag)
[Java] Der verwirrende Teil von String und StringBuilder
Implementieren Sie die Star Five-Funktion mit der for-Anweisung
[Hinweis] Java: Messen Sie die Geschwindigkeit der Zeichenfolgenverkettung
Ich habe die Eigenschaften von Java und .NET verglichen
Array vs ArrayList vs HashMap Erweitert für Statement Race
Kriterien für die ordnungsgemäße Verwendung von render und redirect_to
Lernen Sie den rudimentären Mechanismus und die Verwendung von Gradle 4.4 kennen
Informationen zu next () und nextLine () der Scannerklasse
Was sind die Vorteile von DI und Thymeleaf?
So geben Sie den JavaScript-Index für die Anweisung an
Java für Anweisung
ArrayList und die Rolle der Schnittstelle aus List
Bitte beachten Sie die Aufteilung (Aufteilung) von Java Kotlin Int und Int
Der Vergleich von enum ist == und gleich ist gut [Java]
[Für Anfänger] Verstehen Sie schnell die Grundlagen von Java 8 Lambda
[Grails] Über den Einstellungsbereich und die Einstellungselemente von application.yml
Geschwindigkeitsvergleich zum Zeitpunkt der Generierung zum Zeitpunkt der Datumskonvertierung
Konvertieren Sie das Array von error.full_messages in Zeichen und geben Sie es aus
Schreiben Sie den Code für java.io.File mit java.nio.Path und java.nio.Files neu
Den aktuellen Status von Java organisieren und die Zukunft betrachten
Java-Sprache aus der Sicht von Kotlin und C #
Bis zur Verwendung von Spring Data und JPA Part 2
Vergleichen Sie den Unterschied zwischen Docker-Datei vor und nach Docker-Slim
Zum ersten Mal lernen Java # 3 Ausdrücke und Operatoren
Überprüfung der Beziehung zwischen dem Docker-Image und dem Container
Bis zur Verwendung von Spring Data und JPA Part 1
Ich habe die Typen und Grundlagen von Java-Ausnahmen zusammengefasst
Ich habe versucht, die erweiterte for-Anweisung in Java zu verwenden
Java Häufig verwendete Anweisungsliste (für Anfänger und Anfänger)
Bereiten Sie die Umgebung für Java11 und JavaFx mit Ubuntu 18.4 vor