Java Streams .max() 和 .min() 性能滞后?
Java Streams .max() and .min() lag in performance?
考虑以下 2 个示例。
1 有流
myList.stream().map(this::getInt).max(Integer::compareTo);
2 老办法
int max = Integer.MIN_VALUE;
for (MyItem item : myList) {
max = Math.max(max, getInt(item));
}
以上 getInt
方法接受 MyItem
参数和 returns int
结果。
在这里,与#1 相比,#2 的延迟要低得多。有谁知道为什么或我出了什么问题吗?
您或许应该利用 Streams 的功能来优化这些情况。阅读 Streams 的文档,第一个示例显示了 IntStream 的优化路径。
https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html
int max = myList.stream()
.mapToInt(this::getInt)
.max()
.orElse(Integer.MIN_VALUE);
myList.stream().mapToInt(this::getInt).max()
尝试 mapping to an IntStream
. An IntStream
works with int
s internally, which avoids the overhead of boxing and unboxing Integer
objects. Also, IntStream.max()
不需要自定义比较器。
So you suggest that the prominent reason is 'boxing' and 'unboxing'?
如果没有 运行 它通过你的基准测试,我不知道它是否会匹配 for
循环的性能。但它会有所改善。如果它不够好,那么我建议坚持使用循环,因为我看不到任何其他改进它的方法。
考虑以下 2 个示例。
1 有流
myList.stream().map(this::getInt).max(Integer::compareTo);
2 老办法
int max = Integer.MIN_VALUE;
for (MyItem item : myList) {
max = Math.max(max, getInt(item));
}
以上 getInt
方法接受 MyItem
参数和 returns int
结果。
在这里,与#1 相比,#2 的延迟要低得多。有谁知道为什么或我出了什么问题吗?
您或许应该利用 Streams 的功能来优化这些情况。阅读 Streams 的文档,第一个示例显示了 IntStream 的优化路径。
https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html
int max = myList.stream()
.mapToInt(this::getInt)
.max()
.orElse(Integer.MIN_VALUE);
myList.stream().mapToInt(this::getInt).max()
尝试 mapping to an IntStream
. An IntStream
works with int
s internally, which avoids the overhead of boxing and unboxing Integer
objects. Also, IntStream.max()
不需要自定义比较器。
So you suggest that the prominent reason is 'boxing' and 'unboxing'?
如果没有 运行 它通过你的基准测试,我不知道它是否会匹配 for
循环的性能。但它会有所改善。如果它不够好,那么我建议坚持使用循环,因为我看不到任何其他改进它的方法。