for循环、并行流、串行流效率比较

User类
import lombok.AllArgsConstructor;import lombok.Builder;import lombok.Data;import lombok.NoArgsConstructor;

@Builder@Data@AllArgsConstructor@NoArgsConstructorpublic class User {    int id;    String name;    int sex;    int age;

}

测试类
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;import java.time.temporal.TemporalField;import java.util.ArrayList;import java.util.List;import java.util.stream.Collectors;

@RestControllerpublic class TestController {

    public static void main(String[] args) {        List<User> userList = new ArrayList<>();        for (int i = 0; i < 100; i++) {            int sex = 0;            if ((i & 1) == 1) {                sex = 1;            }            User user = User.builder().id(i).name("刘-" + i).sex(sex).age(i).build();            userList.add(user);        }        System.out.println("=====数据总量:" + userList.size());

        long beginTime = System.currentTimeMillis();        int sumAge1 = 0;        for (User user : userList) {            sumAge1 += user.getAge();        }        long endTime = System.currentTimeMillis();        System.out.println("=====增强for循环所用时间 " + (endTime - beginTime) + " 毫秒" + " ,计算结果" + sumAge1);

        beginTime = System.currentTimeMillis();        int sumAge2 = userList.stream().collect(Collectors.summingInt(User::getAge));        endTime = System.currentTimeMillis();        System.out.println("=====顺序流所用时间 " + (endTime - beginTime) + " 毫秒, 计算结果" + sumAge2);

        beginTime = System.currentTimeMillis();        int sumAge = userList.parallelStream().mapToInt(User::getAge).sum();        endTime = System.currentTimeMillis();        System.out.println("=====并行流所用时间 " + (endTime - beginTime) + " 毫秒, 计算结果" + sumAge);

    }

}

测试结果:

一千五百万的时候并行流最快

到20000000就内存溢出了。

所以通常的处理逻辑for循环性能更优。

原文地址:https://www.cnblogs.com/lalalazar/p/12391393.html

时间: 2024-11-10 00:57:31

for循环、并行流、串行流效率比较的相关文章

Stream 源码分析(串行流)

Stream 支持顺序和并行聚合操作的一组元素序列. 1)operations:支持在单个元素上执行的操作,流操作分为中间操作和终止操作 1-1)中间操作: 1-1-1)无状态:unordered().filter().map().mapToInt().mapToLong().mapToDouble. flatMap().flatMapToInt().flatMapToLong().flatMapToDouble(). peek() 1-1-2)有状态:distinct().sorted().l

背水一战 Windows 10 (118) - 后台任务: 后台下载任务(任务分组,并行或串行执行,组完成后通知)

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 后台任务 后台下载任务(任务分组,并行或串行执行,组完成后通知) 示例演示后台下载任务的分组,以及如何设置组内任务是并行执行还是串行执行,以及组任务全部完成后如何 toast 或 tile 通知)BackgroundTask/TransferModel.cs /* * 扩展了 DownloadOperation 和 UploadOperation,用于 MVVM 绑定数据 */ using System; using S

Java8新特性 - 并行流与串行流

并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流. Java8中将并行进行了优化,我们可以很容易的对数据进行并行操作.Stream API可以声明性地通过parallel()和sequential()在并行流和顺序流之间进行切换. 在了解并行流之前,我们首先需要了解Fork/Join框架 Fork/Join框架 Fork/Join框架:在必要的情况下,将一个大任务进行拆分(fork)成若干个小任务(拆到不可在拆时),在将一个个的小任务运算的结果进行汇总(join). Fo

iOS:转载:同步、异步、并行、串行的详解

理解 iOS 开发中 GCD 相关的同步(synchronization)\ 异步(asynchronization),串行(serial)\ 并行(concurrency)概念 2014年11月21日iOSasynchronization.concurrency.GCD.iOS.serial.synchronization.串行.同步.并发.异步 iOS 开发过程中,常常需要用到多线程技术,GCD 是常用的实现多线程的技术,其因简洁底层而备受欢迎. GCD 技术中,同步(synchroniza

Quartz定时任务的并行与串行

Quartz定时任务的执行策略有并行和串行之分. 所谓并行是指多个任务同时运行的情况,即若两个任务的执行时间存在重叠,两个任务同时运行的情况. 串行则是指一个任务必须等其前一个任务执行完毕之后再执行的策略. Spring集成Quartz时,控制定时任务的并行和串行是通过concurrent(译:同时发生的; 同时完成的; 同时存在的)属性实现的. 当任务系统存在多个定时任务时,任务执行很可能会存在时间上的重叠,通过设置concurrent属性为false,可以避免任务并行执行,job只能在其前一

同步 ,异步,并发/并行,串行

同步:多个任务情况下,一个任务A执行结束,才可以执行另一个任务B.只存在一个线程. 异步:多个任务情况下,一个任务A正在执行,同时可以执行另一个任务B.任务B不用等待任务A结束才执行.存在多条线程. 接下来分析一下并行/并发,串行.很多人大概会混淆这些概念. 并发和并行其实是异步队列实现的两种形式.并行其实是真正的异步,多核CUP可以同时开启多条线程供多个任务同时执行,互补干扰,如上图的并行,其实和异步图例一样.但是并发就不一样了,是一个伪异步.在单核CUP中只能有一条线程,但是又想执行多个任务

IOS多线程知识总结/队列概念/GCD/串行/并行/同步/异步

进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间: 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程. 队列:dispatch_queue_t,一种先进先出的数据结构,线程的创建和回收不需要程序员操作,由队列负责. 串行队列:队列中的任务只会顺序执行(类似跑步) dispatch_queue_t q = dispatch_queue_create(“....”, dispatch_queue_serial); 并

串行乘法与并行乘法

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 串行乘法 OR1200中串行乘法采用的是"移位--加"迭代算法,这种算法借鉴了手工计算乘法的过程,对于二进制乘法,比如:1101*1011,手工计算过程如图8.1所示. 图8.1 手工计算二进制乘法的过程 从图中可知手工计算时会将被乘数与乘数中每一位依次相乘,最后将所有的乘积项一并相加.这种方法速度快,但是用硬件实现时,会耗费较多硬件资源."移位--加"迭代算法对此作了修改:每算出一乘积项,就加到乘

ios--进程/多线程/同步任务/异步任务/串行队列/并行队列(对比分析)

现在先说两个基本的概念,啥是进程,啥是线程,啥又是多线程;先把这两个总是给弄清再讲下面的 进程:正在进行的程序,我们就叫它进程. 线程:线程就是进程中的一个独立的执行路径.这句话怎么理解呢! 一个程序它是按顺序从上往下执行的, 这个执行顺序我们可以把它看成是一条线,把这条线就叫做线程(个人理解,错了勿喷);每一个程序中至少包含一条线程, 这条线程,我们叫它主线程. 多线程:多线程也就是说一个程序中有多条执行路径.在iOS当中将一些比较耗时的操作放到另一条执行路径里.让它与主线程同时运行.这样不会