我只是尝试了一些代码片段,发现使用简单的for循环比使用Java 8流获得了更好的性能结果。现在,我可能在理解这些事情方面有所遗漏。我需要帮助理解差异。以下是我的代码。
//Following takes almost 3ms
public int[] testPerf(int[] nums, int[] index) {
List<Integer> arrayL = new ArrayList<>();
for(int i =0; i< index.length; i++){
arrayL.add(index[i], nums[i]);
}
return arrayL.stream().mapToInt(i -> i).toArray();
}
//Following takes almost 1ms
public int[] testPerf(int[] nums, int[] index) {
List<Integer> arrayL = new ArrayList<>();
for(int i =0; i< index.length; i++){
arrayL.add(index[i], nums[i]);
}
int [] result = new int[index.length];
for(int i =0; i< index.length; i++){
result[i] = arrayL.get(i);
}
return result;
}
编辑:开始
我试图测试什么?将nums数组的元素插入到由索引数组指定的位置,形成最终结果。
Input: nums = [0,1,2,3,4], index = [0,1,2,2,1]
Output: [0,4,1,3,2]
Explanation:
nums index target
0 0 [0]
1 1 [0,1]
2 2 [0,1,2]
3 2 [0,1,3,2]
4 1 [0,4,1,3,2]
编辑:结束
请注意,我已经使用不同的输入和包含2k+元素的数组进行了测试,但是使用 for 循环的代码仍然表现更好。
请指导其他代码为什么需要更长时间?另外,请指出任何可以学习在哪些情况下不要使用 Java 流的参考资料?(在什么情况下不要过于复杂化?:))
return Arrays.stream(nums).toArray();
- 你的代码不够优化。其次,微基准测试非常难以正确执行(而且你没有包含测试工具,这导致你得出了哪个更快的结论)。 - Elliott Frischreturn nums.clone();
呢?因为这将是相同结果的更快的版本。并且这还完全忽略了index
参数的存在,这个参数很可能有它的用途。 - Andreas