我在写一段代码,其中有一个字符串[]和一个方法,该方法接受这个字符串[]并返回字节[],保持字符串-字节对的位置,其中很少有字节可以为空。最后,我必须对字节进行转换,并从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()方法,从而避免装箱?
您可以使用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\