Java Streams .max() and .min() lag in performance?

拈花ヽ惹草 提交于 2020-05-25 08:47:14

问题


Consider Below 2 examples.

1 With Streams

myList.stream().map(this::getInt).max(Integer::compareTo);

2 Old way

int max = Integer.MIN_VALUE;
for (MyItem item : myList) {
    max = Math.max(max, getInt(item));    
}

Above getInt method accepts a MyItem argument and returns an int result.

Here, #2 gives me a much lower latency compared to #1. Does anyone have an idea why or anything going wrong for me?


回答1:


myList.stream().mapToInt(this::getInt).max()

Try mapping to an IntStream. An IntStream works with ints internally, which avoids the overhead of boxing and unboxing Integer objects. Also, IntStream.max() doesn't need a custom comparator.

So you suggest that the prominent reason is 'boxing' and 'unboxing'?

Without running it through your benchmark I don't know if it'll match the for loop's performance. But it'll be an improvement. If it's not good enough then I suggest sticking with the loop as I don't see any other way to improve it.




回答2:


You should probably take advantage of features of Streams, that should optimise these cases. Read the docs for Streams, the first example shows the optimised path for 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);


来源:https://stackoverflow.com/questions/61619407/java-streams-max-and-min-lag-in-performance

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!