java - IntStream 如何避免隐性拳击成本

标签 java performance lambda

当你有

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

对比

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

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

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

最佳答案

IntStreamStream<T> 的特化哪个进程int primitive值。

查看IntStream接口(interface):

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

可以看到这个接口(interface)只使用int primitive Predicate的专业版本, Function , Consumer ...所以它不需要装箱来与 int 一起工作(因为它直接与 int 一起操作)

关于自动装箱的性能成本,可以引用java guide :

It is not appropriate to use autoboxing and unboxing for scientific computing, or other performance-sensitive numerical code

这是因为,每次调用操作都需要intInteger或输入intInteger容器中,编译器会为您注入(inject)一个 box/unbox 方法调用。

对于正常操作来说,性能相当微不足道,但如果您有密集的循环或时间关键的代码行,那么您应该避免自动装箱。

关于java - IntStream 如何避免隐性拳击成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56404114/

相关文章:

java - 检测关闭的套接字

python - 转置 Pandas DataFrame 中的列子集,同时使用其他列作为分组变量?

c++ - 检查类型是否是包含泛型 lambda 的仿函数

java - 如何使用 Java 以编程方式检查 ubuntu 上是否安装了软件实用程序

java - 无法执行目标 org.apache.maven.plugins :maven-javadoc-plugin

c++ - 双CPU内存分配性能

javascript - 重复的 gsap 动画代码和服务器加载时间

java - 无法将 void 转换为 java.lang.Void

java - 用于以固定、非自然顺序比较/排序有限值的 Lambda 表达式

java - Activity 布局未显示