Khi nghi ngờ, hãy kiểm tra! Sử dụng JMH, tôi nhận được kết quả như sau trên một danh sách 100k yếu tố (trong micro, nhỏ hơn là tốt hơn):
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
Vì vậy, bạn có, từ nhanh đến chậm hơn:
for(int i : list) sum += i*i;
mapToInt(x -> x * x).sum()
và mapToInt(x -> x).map(x -> x * x).sum()
collect(Collectors.summingInt(x -> x * x))
map(x -> x * x).reduce((x, y) -> x + y).get()
Lưu ý rằng các kết quả phụ thuộc rất nhiều vào các tối ưu hóa JIT. Nếu logic trong ánh xạ phức tạp hơn, một số tối ưu có thể không có sẵn (mã dài hơn = ít nội tuyến) trong trường hợp các phiên bản luồng có thể mất nhiều hơn 4-5 lần so với vòng lặp - nhưng nếu logic đó là CPU nặng sự khác biệt sẽ giảm một lần nữa. Việc lập hồ sơ đơn đăng ký thực tế của bạn sẽ cung cấp cho bạn thêm thông tin.
đang Benchmark để tham khảo:
@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();
}
}
Trong khi ở trường hợp cụ thể này, đúp đồ thêm chút, có những trường hợp tách một biến đổi thành nhiều phần sẽ làm cho việc tính toán có thể đọc được nhiều hơn hoặc đơn giản hơn. (Và, khi hoạt động lập bản đồ tăng trọng lượng, chi phí của giai đoạn bổ sung trở nên tương đối ít hơn.) –