Java 对于6个元素,并行流比循环花费更多的时间

Java 对于6个元素,并行流比循环花费更多的时间,java,java-stream,Java,Java Stream,我只尝试了6个元素,因为我没有太多的数据。 每种方法我都运行了三次 当我运行basic for循环时,它比并行流花费的时间要少。是因为数量少还是记录少。若有,我可以得到任何图表,我可以看到在五月记录之后,平行流如何超越基本for循环for基本操作 long startTime = System.nanoTime(); // 222436 331094 316872ns for (int i = 0; i < employeeOtps.size(); i++)

我只尝试了6个元素,因为我没有太多的数据。 每种方法我都运行了三次

当我运行basic for循环时,它比并行流花费的时间要少。是因为数量少还是记录少。若有,我可以得到任何图表,我可以看到在五月记录之后,平行流如何超越基本for循环for基本操作

    long startTime = System.nanoTime();
    // 222436   331094  316872ns
    for (int i = 0; i < employeeOtps.size(); i++) {
        Employee emp = employees.get(i);
        EmployeeOtp employeeOtp = employeeOtps.get(i);
        emp.setMobileNo(employeeOtp.getReqValue());
        employees.set(i, emp);
    }

    // OR this one
    // 3071437  3879830 3177251ns
    IntStream.range(0, employeeOtps.size()).parallel.forEach(i -> 
    { 
        EmployeeMaster emp = employees.get(i); 
        EmployeeOtp employeeOtp = employeeOtps.get(i);
        emp.setMobileNo(employeeOtp.getReqValue());
        employees.set(i, emp); 
      });

    // OR this one
    //8727341 14350819 6088261ns
    IntStream.range(0, employeeOtps.size()).forEach(i -> 
    { 
        EmployeeMaster emp = employees.get(i); 
        EmployeeOtp employeeOtp = employeeOtps.get(i);
        emp.setMobileNo(employeeOtp.getReqValue());
        employees.set(i, emp); 
      });

    long totalTime = (System.nanoTime() - startTime);
long startTime=System.nanoTime();
//22243631094 316872ns
对于(int i=0;i
{ 
EmployeeMaster emp=employees.get(i);
EmployeeOtp EmployeeOtp=employeeOtps.get(i);
emp.setMobileNo(employeeOtp.getReqValue());
雇员。集合(i,emp);
});
//还是这个
//8727341 14350819 6088261ns
IntStream.range(0,employeeOtps.size()).forEach(i->
{ 
EmployeeMaster emp=employees.get(i);
EmployeeOtp EmployeeOtp=employeeOtps.get(i);
emp.setMobileNo(employeeOtp.getReqValue());
雇员。集合(i,emp);
});
long totalTime=(System.nanoTime()-startTime);
我一个接一个地跑,记录时间

对于回路:-222436310943166872纳秒

不平行的溪流:-3071437387303177251北纬

平行流:-307143738730177251纳秒

尺寸=6的时间顺序更少


basic for loop(290ms)设置、启动、连接和收集多个线程的结果会有开销。当您需要某种副作用时,通常使用并行流,尤其是类似IO的网络调用。对于您的用例,由于项目列表很小,并行流会比较慢,因为它有使用ForkJoinPool的开销。你的代码有点奇怪,老实说,基准测试通常相差100~200ms。在你的情况下,速度要慢10-30倍。不知道你的
set
方法在做什么。除了在其他关于使用并行流进行小集合的评论中提到的缺陷之外,你的基准测试是有缺陷的,没有考虑JIT编译。当使用流运行方法时,需要解释/JIT更多的代码,这会进一步降低速度。编写有意义的基准测试很难,但是避免常见陷阱的一个选择是使用类似于“也值得一读”的东西。设置、启动、连接和收集多个线程的结果会有开销。当您需要某种副作用时,通常使用并行流,尤其是类似IO的网络调用。对于您的用例,由于项目列表很小,并行流会比较慢,因为它有使用ForkJoinPool的开销。你的代码有点奇怪,老实说,基准测试通常相差100~200ms。在你的情况下,速度要慢10-30倍。不知道你的
set
方法在做什么。除了在其他关于使用并行流进行小集合的评论中提到的缺陷之外,你的基准测试是有缺陷的,没有考虑JIT编译。当使用流运行方法时,需要解释/JIT更多的代码,这会进一步降低速度。编写有意义的基准是困难的,但避免常见陷阱的一个选择是使用类似“也值得一读”的东西