Bei der Bearbeitung von ** Elementen eines bestimmten Typs **, die in einem Array oder einer Sammlung enthalten sind, haben wir die Verarbeitungsgeschwindigkeit überprüft, die schneller ist, Stream oder erweitert für Anweisungen.
Ein Array von 100 Millionen Elementen
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 mit 100 Millionen Elementen
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("");
Dieses Mal werden wir mithilfe eines Arrays und einer ArrayList überprüfen. Es werden 50 Millionen Objekte vom Typ Objekt und 50 Millionen Elemente vom Typ String gespeichert.
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");
Art | Zeit |
---|---|
Array | 345ms |
ArrayList | 409ms |
Das Array scheint etwas schneller zu sein.
Für Aussage erweitert
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");
Art | Zeit |
---|---|
Array | 122ms |
ArrayList | 212ms |
In diesem Vergleich haben wir festgestellt, dass die erweiterte for-Anweisung schneller ist als der Stream [^ 1]. Da ich normalerweise keinen Code schreibe, der Millionen oder zehn Millionen Elemente verarbeitet, verwende ich Streams oft ohne viel Bewusstsein, aber wenn ich mich auf die Leistung konzentriere, scheint es, dass Streams mit Vorsicht verwendet werden müssen.
[^ 1]: Wir entschuldigen uns für etwaige Unannehmlichkeiten bei der Messmethode, würden uns aber freuen, wenn Sie uns dies mitteilen könnten.
Recommended Posts