在Java 8中使用map流函数的这两种性能有何不同?

时间:2017-07-18 20:32:28

标签: java performance functional-programming

假设我有 mutateElement()的函数,它执行 x 操作,而 mutateElement2()执行 y 操作。这两段代码之间的性能差异是什么。

Piece1:

List<Object> = array.stream().map(elem -> 
    mutateElement(elem);
    mutateElement2(elem);
)
.collect(Collectors.toList());

Piece2:

List<Object> array = array.stream().map(elem -> 
    mutateElement(elem);
)
.collect(Collectors.toList());

array = array.stream().map(elem -> 
    mutateElement2(elem);
)
.collect(Collectors.toList());

显然第一个实现更好,因为它只使用一个迭代器,但第二个使用两个迭代器。但如果我在阵列中说出一百万个元素,那么差异是否会显而易见。

2 个答案:

答案 0 :(得分:2)

  1. 第一个实现并不是更好,因为它只使用一个迭代器,第一个实现更好,因为它只收集一次。

  2. 如果你有一百万个元素,没有人能告诉你这种差异是否会引人注目。 (如果有人试图告诉你,你不应该相信它们。) 基准测试。

答案 1 :(得分:1)

无论您使用流还是外部循环,问题都是一样的 第一个代码中List上的一次迭代和第二个代码中List上的两次迭代。
执行第二个代码的时间在逻辑上更为重要。

除了在流上调用两次终端操作外:

.collect(Collectors.toList());

而不是一次,也有成本。

  

但如果我说了一百万个元素,差异是否会显而易见   在阵列中。

可能是。
 现在问题很难回答:是或否。
它取决于其他参数,例如cpus,并发用户数和处理数以及您对#34;明显&#34;的定义。