什么时候不使用 java8 流?

dev*_*v2d 5 java arrays java-8 java-stream

我只是尝试了一些代码片段并发现了一个观察结果,与使用 java 8 流相比,使用简单的 for 循环给了我更好的性能结果。现在,我可能在理解这些事情时错过了一些东西。我需要帮助理解差异。在下面添加我的代码。

//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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:开始

我想测试什么?在索引数组指定的索引处注入 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]
Run Code Online (Sandbox Code Playgroud)

编辑:结束

请注意,我已经使用不同的输入测试了这些并尝试了包含 2k+ 个元素的数组,但带有 for 循环的代码仍然给了我更好的性能。

请指导是什么使其他代码花费更多时间?还要指出我可以学习何时不使用 java 流的任何参考资料?(什么时候不要过于复杂?:))

bob*_*bah 2

如果可以的话,我会在循环上使用流(我在循环上使用任何东西),因为流通常更容易编写而没有错误,即使在没有测试的情况下也是如此,因为它们具有声明性的统一语法。出于同样的原因,即使没有彻底的评论,它们通常对于非作者来说也更容易阅读。此外,流是惰性的(想想“拉”),for 循环是急切的(想想“推”)。懒惰通常会更好。

不幸的是,流有(有时很大)开销,因此在编写性能关键代码时需要注意,尤其是使用收集器时。

因此,类似于“可以时使用流,必须时使用循环”。