IntStream如何避免隐藏的拳击费用

时间:2019-06-01 05:30:50

标签: java performance lambda

有空

Stream.of(1 ,10).reduce(0,(v1, v2) -> v1 + v2);

IntStream.of(1 ,10).reduce(0,(v1, v2) -> v1 + v2);

`IntStream如何?避免隐藏的拳击费用?

为什么拳击在性能上很昂贵?

2 个答案:

答案 0 :(得分:2)

IntStreamStream<T>的特化,它处理int primitive个值。

查看IntStream界面:

IntStream filter(IntPredicate predicate);
IntStream map(IntUnaryOperator mapper);
...

您会看到此接口仅使用int primitivePredicateFunction的{​​{1}}专用版本...因此,不需要装箱就可以使用int(因为它直接与int一起操作)

关于自动装箱的性能成本,您可以参考java guide

  

将自动装箱和拆箱用于科学计算或其他对性能敏感的数字代码是不合适的

这是因为,每次调用操作都需要同时使用Consumerint或将Integer放入int容器中时,编译器将注入box / unbox方法调用为你。

对于正常操作而言,性能并不重要,但是如果您有密集的循环或时间紧迫的代码行,则应避免自动装箱。

答案 1 :(得分:1)

更多关于拳击后果的附录:不仅是对各种其他方法调用的直接惩罚。

请记住,拳击部分会导致创建 new 对象。当然,由于创建对象是OOP中的常见操作,因此该操作已得到高度优化。但是,仍然需要花费时间来获取新对象的内存,并且它的构造函数和所有其他初始化步骤都需要运行。这基本上加起来。更糟糕的是:大规模执行此操作时,将给垃圾收集器带来沉重负担。

(我记得很久以前在这里看到一个问题,OP询问为什么他的应用程序显示极高的GC活动。结果他在做一个大循环,将int值装箱到Integer对象,只是扔掉了。稍等片刻。只需避免装箱就可以大大改善其应用程序的整体性能特征