En opérant sur des ** éléments d'un type spécifique ** contenus dans un tableau ou une collection, nous avons vérifié la vitesse de traitement, qui est plus rapide, Stream ou étendue pour instruction.
Un tableau de 100 millions d'éléments
Object[] objects = new Object[100_000_000];
for (int i = 0; i < 50_000_000; i++)
objects[i] = new Object();
for (int i = 50_000_000; i < 100_000_000; i++)
objects[i] = "";
ArrayList avec 100 millions d'éléments
List<Object> objects = new ArrayList<>();
for (int i = 0; i < 50_000_000; i++)
objects.add(new Object());
for (int i = 0; i < 50_000_000; i++)
objects.add("");
Cette fois, nous allons vérifier en utilisant un tableau et ArrayList. Il stocke respectivement 50 millions d'éléments de type Object et de type String.
Stream
long start = System.currentTimeMillis();
objects.stream() // Arrays.stream(objects)
.filter(String.class::isInstance)
.map(String.class::cast)
.forEach(String::toUpperCase);
long finish = System.currentTimeMillis();
System.out.println(finish - start + "ms");
type | temps |
---|---|
Tableau | 345ms |
ArrayList | 409ms |
Le tableau semble être un peu plus rapide.
Étendu pour déclaration
long start = System.currentTimeMillis();
for (Object obj : objects) {
if (obj instanceof String) {
((String) obj).toUpperCase();
}
}
long finish = System.currentTimeMillis();
System.out.println(finish - start + "ms");
type | temps |
---|---|
Tableau | 122ms |
ArrayList | 212ms |
Dans cette comparaison, nous avons constaté que l'instruction for étendue est plus rapide que le Stream [^ 1]. Comme je n'écris généralement pas de code qui gère des millions ou dix millions d'éléments, j'utilise souvent des flux sans grande conscience, mais il semble que les flux doivent être utilisés avec prudence lorsque l'on se concentre sur les performances.
[^ 1]: Nous vous prions de nous excuser pour tout inconvénient lié à la méthode de mesure, mais nous vous serions reconnaissants de bien vouloir nous le faire savoir.
Recommended Posts