当前位置: 首页 > 知识库问答 >
问题:

intStream.boxed()vs for循环|性能

夏弘文
2023-03-14

我在写一段代码,其中有一个字符串[]和一个方法,该方法接受这个字符串[]并返回字节[],保持字符串-字节对的位置,其中很少有字节可以为空。最后,我必须对字节进行转换,并从string[]中获取一个键为string,值为转换返回值的映射。这就是我在Java 8流中实现相同功能的方式:

IntStream.range(0, productReferences.length)
            .filter(index -> (null!= productsPrice[index])).boxed()
            .collect(Collectors.toMap(position -> productReferences[position],
                    position ->callSomeMethod(productsPrice[position])));

其中productReference是字符串[],ProductSpice[]是字节[]数组。

现在的问题是IntStream。boxed()方法。在内部,它将int转换为Integer,以便返回一个我认为代价更高的流。

另一种方法是使用java for循环

    for(int i=0;i<productReferences.length; i++){
    if (productsPrice[index]==null) continue;
    //other code
}

处理这种情况的最佳方式是什么?我理解创建IntStream的原因,但如果我真的可以在collect方法中使用索引,而不使用boxed()方法,从而避免装箱?

共有1个答案

罗鸿畴
2023-03-14

您可以使用IntStream上的collect操作,而不是将其装箱到流中

IntStream.range(0, productReferences.length)
         .filter(index -> productsPrice[index] != null)
         .collect(
            HashMap::new,
            (m, i) -> m.put(productReferences[i], callSomeMethod(productsPrice[i])),
            Map::putAll
         );

这不会将每个索引都装箱成一个整数,因为收集器的消费者部分采用了一个对象消费者;所以上面代码中的i是一个int。正如霍尔格所指出的,初始代码使用收集器。toMap会在重复键的情况下引发异常,此时该版本会覆盖该值。

您仍然需要根据实际数据对这两种解决方案进行基准测试,以查看这是否会带来改进。

 类似资料:
  • 如果我有下面的for循环: 我知道外环将迭代次,而内环将为每th从外环迭代一次。 因此,为了确定时间复杂度,我们有一些类似于 不确定如何继续并得到一个封闭形式的时间复杂度。

  • 我试图将我的编程风格从命令式切换到声明式,但有一些概念困扰着我,比如当涉及到循环时的性能。例如,我有一个原始数据,在操作它之后,我希望得到3个预期结果:itemsHash、namesHash、rangeItemsHash 为了达到预期的结果,命令式只循环一次,而声明式至少循环3次(、、)。哪一个比较好?在性能上有什么权衡吗?

  • 问题内容: 我在评估我的Java代码时遇到了一个大问题。为了简化问题,我编写了以下代码,它们产生相同的奇怪行为。重要的是方法run()和给定的双倍价值率。对于运行时测试(在main方法中),我将速率设置为0.5倍,另一次设置为1.0。如果值为1.0,则将在每次循环迭代中执行if语句;如果值为0.5,则将执行一半的if语句。因此,在第一种情况下,我希望运行时更长,但事实恰恰相反。谁能解释这个现象?

  • 问题内容: 当我的研究使我相信循环是PHP中最快的迭代构造…为了使它更清晰时,您认为以下哪个会更快? 示例一 示例二 我的逻辑是,在示例中的每次迭代中,在每次迭代中访问myLargeArray的长度比在示例二中访问简单的整数值要昂贵。那是对的吗? 问题答案: 第一种方法较慢,因为必须在循环的每次迭代中都调用该函数。该方法本身非常快,但是调用该函数仍然有一些开销。通过将其移动到循环之外,您正在执行所

  • 这个问题继续我的问题(根据神秘主义者的建议): C代码循环性能 继续我的问题,当我使用压缩指令而不是标量指令时,使用内部函数的代码看起来非常相似: 该内核的测量性能约为每个周期5.6个FP操作,尽管我预计它的性能恰好是标量版本的4倍,即每个周期4.1,6=6,4个FP操作。 考虑到权重因素的变动(感谢您指出),时间表如下所示: 虽然在movss操作之后有一条额外的指令将标量权重值移动到XMM寄存器

  • 我在玩jmh,在关于循环的部分,他们说 您可能会注意到重复次数越多,被测量操作的“感知”成本就越低。到目前为止,我们每次添加都使用1/20 ns,远远超出了硬件的实际能力。发生这种情况是因为循环被大量展开/流水线化,并且要测量的操作是从循环中提升的。士气:不要过度使用循环,依靠JMH来获得正确的测量。 我自己也试过了 并得到以下结果: 它确实显示了MyBenchmark。MeasureError\