Im Zweifelsfall Test! Mit jmh ich die folgenden Ergebnisse auf einer Liste von 100k Elemente erhalten (in Mikrosekunden, kleiner ist besser):
Benchmark Mode Samples Score Error Units
c.a.p.SO32462798.for_loop avgt 10 119.110 0.921 us/op
c.a.p.SO32462798.mapToInt avgt 10 129.702 1.040 us/op
c.a.p.SO32462798.mapToInt_map avgt 10 129.753 1.516 us/op
c.a.p.SO32462798.map_reduce avgt 10 1262.802 12.197 us/op
c.a.p.SO32462798.summingInt avgt 10 134.821 1.203 us/op
So haben Sie, von schneller zu langsamer:
for(int i : list) sum += i*i;
mapToInt(x -> x * x).sum()
und mapToInt(x -> x).map(x -> x * x).sum()
collect(Collectors.summingInt(x -> x * x))
map(x -> x * x).reduce((x, y) -> x + y).get()
Beachten Sie, dass die Ergebnisse stark von den JIT-Optimierungen abhängig sind. Wenn die Logik im Mapping komplexer ist, können einige der Optimierungen nicht verfügbar sein (längerer Code = weniger Inlining). In diesem Fall können die Streamversionen 4-5x mehr Zeit benötigen als die for-Schleife - aber wenn diese Logik CPU-lastig ist, Differenz wird sich wieder verringern. Profiling Ihrer tatsächlichen Anwendung erhalten Sie weitere Informationen.
Benchmark-Code als Referenz:
@State(Scope.Benchmark)
@BenchmarkMode(Mode.AverageTime)
public class SO32462798 {
List<Integer> list;
@Setup public void setup() {
list = new Random().ints(100_000).boxed().collect(toList());
}
@Benchmark public int for_loop() {
int sum = 0;
for (int i : list) sum += i * i;
return sum;
}
@Benchmark public int summingInt() {
return list.stream().collect(Collectors.summingInt(x -> x * x));
}
@Benchmark public int mapToInt() {
return list.stream().mapToInt(x -> x * x).sum();
}
@Benchmark public int mapToInt_map() {
return list.stream().mapToInt(x -> x).map(x -> x * x).sum();
}
@Benchmark public int map_reduce() {
return list.stream().map(x -> x * x).reduce((x, y) -> x + y).get();
}
}
Während in diesem speziellen Fall die Doppelkarte wenig fügt hinzu, gibt es Fälle, in denen eine Transformation in mehrere Teile zu trennen wird die Berechnung besser lesbar oder einfacher machen. (Und da die Mapping-Operation zunimmt, wird der Overhead der zusätzlichen Stufe proportional geringer.) –