Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java流开销的原因和影响_Java_Algorithm_Java Stream - Fatal编程技术网

Java流开销的原因和影响

Java流开销的原因和影响,java,algorithm,java-stream,Java,Algorithm,Java Stream,我正在研究LeetCode上的问题。我尝试了两个相同的解决方案,除了第一个使用Java流,另一个不使用。两个都被接受了,但第一个需要38毫秒,第二个的运行时间可以忽略不计(0毫秒)。我想知道造成如此巨大差异的原因是什么。下面是我的代码 解决方案1 import java.util.*; import java.util.stream.Collectors; class Solution { List<List<Integer>> ans = new Linked

我正在研究LeetCode上的问题。我尝试了两个相同的解决方案,除了第一个使用Java流,另一个不使用。两个都被接受了,但第一个需要38毫秒,第二个的运行时间可以忽略不计(0毫秒)。我想知道造成如此巨大差异的原因是什么。下面是我的代码

解决方案1

import java.util.*;
import java.util.stream.Collectors;

class Solution {
    List<List<Integer>> ans = new LinkedList<>();

    private void swap(int[] nums, int i, int j) {
        int t = nums[i];
        nums[i] = nums[j];
        nums[j] = t;
    }

    private void permutation(int[] nums, int pos) {
        if (pos == nums.length - 1) {
//            List<Integer> temp = new LinkedList<>();
//            for (int n : nums)
//                temp.add(n);
//            ans.add(temp);
            ans.add(Arrays.stream(nums).boxed().collect(Collectors.toList()));
        }
        for (int i = pos; i < nums.length; i++) {
            swap(nums, i, pos);
            permutation(nums, pos + 1);
            swap(nums, i, pos);
        }
    }

    public List<List<Integer>> permute(int[] nums) {
        permutation(nums, 0);
        return ans;
    }
}
import java.util.*;
导入java.util.stream.collector;
类解决方案{
List ans=新链接列表();
私有无效交换(int[]nums,int i,int j){
int t=nums[i];
nums[i]=nums[j];
nums[j]=t;
}
私有无效置换(int[]nums,int pos){
如果(pos==nums.length-1){
//List temp=new LinkedList();
//用于(整数n:nums)
//温度添加(n);
//ans.add(温度);
anas.add(Arrays.stream(nums).boxed().collect(Collectors.toList());
}
对于(int i=pos;i
解决方案2

import java.util.*;
import java.util.stream.Collectors;

class Solution {
    List<List<Integer>> ans = new LinkedList<>();

    private void swap(int[] nums, int i, int j) {
        int t = nums[i];
        nums[i] = nums[j];
        nums[j] = t;
    }

    private void permutation(int[] nums, int pos) {
        if (pos == nums.length - 1) {
            List<Integer> temp = new LinkedList<>();
            for (int n : nums)
                temp.add(n);
            ans.add(temp);
//            ans.add(Arrays.stream(nums).boxed().collect(Collectors.toList()));
        }
        for (int i = pos; i < nums.length; i++) {
            swap(nums, i, pos);
            permutation(nums, pos + 1);
            swap(nums, i, pos);
        }
    }

    public List<List<Integer>> permute(int[] nums) {
        permutation(nums, 0);
        return ans;
    }
}

import java.util.*;
导入java.util.stream.collector;
类解决方案{
List ans=新链接列表();
私有无效交换(int[]nums,int i,int j){
int t=nums[i];
nums[i]=nums[j];
nums[j]=t;
}
私有无效置换(int[]nums,int pos){
如果(pos==nums.length-1){
List temp=new LinkedList();
用于(整数n:nums)
温度添加(n);
ans.add(温度);
//anas.add(Arrays.stream(nums).boxed().collect(Collectors.toList());
}
对于(int i=pos;i

谢谢您的时间。

好吧,有很多类要加载,这会显著增加启动时间……请接受流有开销的事实。如果您真的想知道它是什么,请查看源代码。讨论streams是如何实现的以及开销是什么的细节太广泛了,在这里无法涵盖,这对于本网站来说有点离题。请注意,您看到的差异部分是由于各种JVM启动/预热效果造成的。设计良好的基准将消除这些问题。我建议您对“Java基准测试框架”进行一些研究,并使用类似“jmh”的东西来实现这样的基准测试。但是,您对流速度较慢的观察是正确的。有关流如何在封面下工作的信息,请参阅Brian Goetz。与with一样,Leetcode在输入代码之前不会测量它自己使用的(或JVM已经使用的)任何东西的初始化。但它既不使用lambda表达式,也不使用streamapi。顺便说一下,如果不使用
LinkedList
,您的代码会更快。这一点尤其正确,因为您知道创建时列表的大小,因此可以使用正确的初始容量创建
ArrayList
s。