[JAVA] Comparez la vitesse de l'instruction for et de l'instruction for étendue.

introduction

L'instruction for étendue est plus rapide que l'instruction for normale car elle utilise Iterator! Quelqu'un m'a dit que je l'avais laissé tel quel sans le vérifier. À ce moment, j'ai décidé de faire une enquête appropriée. Et s'il s'agissait de l'histoire qu'une phrase normale est meilleure ... Je pense que l'ère est stream, mais comme mon site est Java 6, je dois apprendre à mes juniors à écrire en Java 6. ~~ Ce n'est pas parce que je ne peux pas écrire un flux. ~~

Environnement de vérification

je l'ai écrit

code de vérification

Quand je l'ai fait à environ 100 000, la valeur était trop petite pour être comparée, alors je l'ai bouclée 10 millions de fois.

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);
		}

		//début
		long start = System.currentTimeMillis();
		//10 millions de boucles
		for (int i = 0; i < list.size(); i++) {
			int tmp = list.get(i);
		}
		//Fin
		long end = System.currentTimeMillis();
		System.out.println("pour déclaration: " + (end - start) + " ms");

		//début
		start = System.currentTimeMillis();
		//10 millions de boucles
		for (Integer i : list) {
			int tmp = i;
		}
		//Fin
		end = System.currentTimeMillis();
		System.out.println("Étendu pour déclaration: " + (end - start) + " ms");

	}

}

résultat de l'inspection

Quel idiot ... Je l'ai essayé plusieurs fois, mais la déclaration étendue pour ne s'est pas accélérée.

pour déclaration: 24 ms
Étendu pour déclaration: 29 ms

Vérification ②

Quand j'ai pensé que ça ne finirait pas comme ça, il y avait un site comme celui-ci.

Raison de l'utilisation de la déclaration étendue - [Seasar] Diary of soichirooooo5

Si vous regardez le lien, la réponse que vous vouliez écrire dans cet article est écrite, C'est un gros problème, alors je vais le faire jusqu'à la fin. Étant donné que la vérification est effectuée uniquement avec ArrayList, je vérifierai également avec Array et LinkedList.

Code de vérification (tableau)

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;
		}

		//début
		long start = System.currentTimeMillis();
		//10 millions de boucles
		for (int i = 0; i < array.length; i++) {
			int tmp = array[i];
		}
		//Fin
		long end = System.currentTimeMillis();
		System.out.println("pour déclaration: " + (end - start) + " ms");

		//début
		start = System.currentTimeMillis();
		//10 millions de boucles
		for (int i : array) {
			int tmp = i;
		}
		//Fin
		end = System.currentTimeMillis();
		System.out.println("Étendu pour déclaration: " + (end - start) + " ms");

	}

}

résultat

~~ pour une phrase trop rapide www ~~ Parce que l'autoboxing a été effectué dans l'instruction Extended for Je ne pouvais pas le mesurer avec précision. Le résultat reste le même.

pour déclaration: 3 ms
Étendu pour déclaration: 3 ms

Vérification (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);
		}

		//début
		long start = System.currentTimeMillis();
		//10 millions de boucles
		for (int i = 0; i < list.size(); i++) {
			int tmp = list.get(i);
		}
		//Fin
		long end = System.currentTimeMillis();
		System.out.println("pour déclaration: " + (end - start) + " ms");

		//début
		start = System.currentTimeMillis();
		//10 millions de boucles
		for (Integer i : list) {
			int tmp = i;
		}
		//Fin
		end = System.currentTimeMillis();
		System.out.println("Étendu pour déclaration: " + (end - start) + " ms");

	}

}

résultat de l'inspection

Je n'ai pas reçu de réponse depuis environ 5 minutes.

Vérification (LinkedList) ②

Puisqu'il ne se termine pas, revérifiez avec 100 000 boucles

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);
		}

		//début
		long start = System.currentTimeMillis();
		//10 millions de boucles
		for (int i = 0; i < list.size(); i++) {
			int tmp = list.get(i);
		}
		//Fin
		long end = System.currentTimeMillis();
		System.out.println("pour déclaration: " + (end - start) + " ms");

		//début
		start = System.currentTimeMillis();
		//10 millions de boucles
		for (Integer i : list) {
			int tmp = i;
		}
		//Fin
		end = System.currentTimeMillis();
		System.out.println("Étendu pour déclaration: " + (end - start) + " ms");

	}

}

Résultat de la vérification ②

c'est incroyable! !!

pour déclaration: 5695 ms
Étendu pour déclaration: 36 ms

finalement

Il s'est avéré que l'instruction for normale est plus rapide pour les éléments qui sont exploités dans l'ordre depuis l'avant, tels que ArrayList et les tableaux. Cependant, la liste liée a fait une énorme différence. Il est étrange de se soucier de la substance lors de la boucle de l'interface de liste, donc je pense que j'ai pu arriver à la conclusion que la déclaration étendue pour est bien.

Ce qui suit est une citation du site de référence.

Si vous utilisez l'instruction for étendue, vous n'avez pas à vous soucier d'une "dégradation des performances de 99% ou plus" même si vous ne savez pas si l'objet passé à l'instruction for est ArrayList ou LinkedList.

De plus, l'instruction for étendue convertit le type d'implémentation de l'interface List en code qui utilise un itérateur, et dans le cas d'un tableau, elle le convertit en code qui accède à l'index.

Vous pouvez voir que la traduction de ce compilateur générera le code approprié pour la liste ou le tableau que vous passez à l'instruction for. En d'autres termes, si vous utilisez Extended pour, vous n'avez à penser à rien et vous n'avez à vous soucier de rien. Si quelque chose ne va pas, cela fera quelque chose derrière l'API.

En d'autres termes, vous pouvez utiliser l'instruction Extended for sans penser à rien. stream Étudions.

Recommended Posts

Comparez la vitesse de l'instruction for et de l'instruction for étendue.
Comparaison de la vitesse de traitement entre Stream incluant le cast et Extended for Statement
[Java] pour instruction / étendu pour instruction
J'ai essayé de mesurer et de comparer la vitesse de Graal VM avec JMH
Utilisez-vous l'instruction for après tout? Utilisez-vous l'instruction while? Utilisation correcte des instructions for et while
[Pour les débutants] DI ~ Les bases de DI et DI au printemps ~
À propos de l'instruction et de l'instruction if
[Java] Rendre les variables de l'instruction for étendue et de chaque instruction immuables
L'idée de C # (expression lambda, pour phrase) à mâcher
Ceci et cela de JDK
Comparez la conduite ① et les deux autres conduite
Utilisation des éléments de tableau Java, for, length, value et extended for statements
Comment obtenir le contenu de la carte à l'aide du mémorandum d'instructions
Définissez le nombre de secondes d'avance et de retour rapides dans ExoPlayer
Pliage et dépliage du contenu de la vue Recycleur
À propos du fonctionnement de next () et nextLine ()
Comparer les éléments d'un tableau (Java)
ne doit pas retourner dans l'instruction for
[Introduction à Ruby] À propos du rôle de true et break in the while statement
[Java] De nos jours, l'instruction for étendue n'est pas exclusivement pour List, n'est-ce pas?
Jusqu'à ce que vous compreniez que l'instruction for étendue et l'instruction for utilisant la longueur sont le même processus (gérer un tableau multidimensionnel)
[Rails] Articles pour les débutants pour organiser et comprendre le flux de form_with
Informations de référence pour rechercher et analyser l'état d'utilisation de la mémoire de Tomcat
Vérifiez la version de JDK installée et la version de JDK activée
Pensez à la combinaison de Servlet et Ajax
Officiel de Zeller (demandant le jour)
[Java] La partie déroutante de String et StringBuilder
Implémentez la fonction Star Five à l'aide de l'instruction for
[Note] Java: mesure la vitesse de concaténation de chaînes
J'ai comparé les caractéristiques de Java et .NET
Array vs ArrayList vs HashMap Extended pour Statement Race
Critères pour utiliser correctement render et redirect_to
Apprenez le mécanisme rudimentaire et l'utilisation de Gradle 4.4
À propos de next () et nextLine () de la classe Scanner
Quels sont les avantages de DI et de Thymeleaf?
Comment spécifier l'index de JavaScript pour l'instruction
Java pour instruction
ArrayList et le rôle de l'interface vu depuis List
Veuillez noter la division (division) de java kotlin Int et Int
La comparaison d'énumération est ==, et equals est bonne [Java]
[Pour les débutants] Comprendre rapidement les bases de Java 8 lambda
[Grails] À propos de la zone de paramétrage et des éléments de paramétrage de application.yml
Comparaison de vitesse au moment de la génération au moment de la conversion de la date
Convertit le tableau d'erreurs.full_messages en caractères et sortie
Réécrivez le code de java.io.File avec java.nio.Path et java.nio.Files
Organiser l'état actuel de Java et envisager l'avenir
Langage Java du point de vue de Kotlin et C #
Jusqu'à l'utilisation de Spring Data et JPA Part 2
Comparez la différence entre dockerfile avant et après docker-slim
Apprentissage pour la première fois des expressions et opérateurs Java # 3
Vérification de la relation entre l'image Docker et le conteneur
Jusqu'à l'utilisation de Spring Data et JPA Part 1
J'ai résumé les types et les bases des exceptions Java
J'ai essayé d'utiliser l'instruction Extended for en Java
Liste des instructions Java fréquemment utilisées (pour les débutants et les débutants)
Préparer l'environnement pour java11 et javaFx avec Ubuntu 18.4