java 循环对比_Java stream 和 for 循环效率对比问题

针对同一个集合,用 stream 操作两次得到两个不同条件筛选出来的集合和map,和一次for循环就搞定搞定的效率对比。

虽然stream写起来链式操作很舒服,但效率在不同数据量下的体现效果是不一样的,以下为我的测试代码:

@Test

public void testStreamAndFor() {

List studentList = new ArrayList<>();

// 初始数据量

int listSize = 100000;

// 测试次数,以便求出平均运行时长

int testTimes = 5;

for (int i = 0; i < listSize; i++) {

Student student = new Student();

student.setId(i + 1);

student.setStudentName("name" + i);

student.setAge(i);

studentList.add(student);

}

BigDecimal streamTotalRunTime = new BigDecimal("0");

BigDecimal forTotalRunTime = new BigDecimal("0");

for (int i = 0; i < testTimes; i++) {

Instant streamStart = Instant.now();

Map idMapOfStream = studentList.stream()

.collect(Collectors.toMap(Student::getId, v -> v));

List studentAgeListOfStream = studentList.stream()

.map(Student::getAge)

.collect(Collectors.toList());

long streamRunTime = Duration.between(streamStart, Instant.now()).toMillis();

System.out.println("第" + (i + 1) + "次:" + "stream 耗时:" + streamRunTime);

Instant forStart = Instant.now();

int size = studentList.size();

Map idMapOfFor = new HashMap<>(size);

List ageListOfFor = new ArrayList<>();

for (Student student : studentList) {

idMapOfFor.put(student.getId(), student);

ageListOfFor.add(student.getAge());

}

long forRunTime = Duration.between(forStart, Instant.now()).toMillis();

System.out.println("第" + (i + 1) + "次:" + "for 耗时:" + forRunTime);

streamTotalRunTime = streamTotalRunTime.add(new BigDecimal(streamRunTime + ""));

forTotalRunTime = forTotalRunTime.add(new BigDecimal(forRunTime + ""));

}

System.out.println("list长度为:" + listSize + ", 总共测试次数:" + testTimes);

System.out.println("stream总运行时间(ms) :" + streamTotalRunTime);

System.out.println("for总运行时间(ms) :" + forTotalRunTime);

BigDecimal streamAverageRunTime = streamTotalRunTime.divide(new BigDecimal(testTimes + ""), 2, BigDecimal.ROUND_HALF_UP);

System.out.println("stream平均每次运行时间(ms) :" + streamAverageRunTime);

BigDecimal forAverageRunTime = forTotalRunTime.divide(new BigDecimal(testTimes + ""), 2, BigDecimal.ROUND_HALF_UP);

System.out.println("for平均每次运行时间(ms) :" + forAverageRunTime);

}

当数据量为10w,测试5次的结果输出:

第1次:stream 耗时:81

第1次:for 耗时:13

第2次:stream 耗时:15

第2次:for 耗时:23

第3次:stream 耗时:7

第3次:for 耗时:11

第4次:stream 耗时:7

第4次:for 耗时:13

第5次:stream 耗时:9

第5次:for 耗时:6

list长度为:100000, 总共测试次数:5

stream总运行时间(ms) :119

for总运行时间(ms) :66

stream平均每次运行时间(ms) :23.80

for平均每次运行时间(ms) :13.20

当数据量为100w,测试5次的输出结果:

第1次:stream 耗时:165

第1次:for 耗时:1296

第2次:stream 耗时:447

第2次:for 耗时:62

第3次:stream 耗时:363

第3次:for 耗时:359

第4次:stream 耗时:61

第4次:for 耗时:350

第5次:stream 耗时:389

第5次:for 耗时:43

list长度为:1000000, 总共测试次数:5

stream总运行时间(ms) :1425

for总运行时间(ms) :2110

stream平均每次运行时间(ms) :285.00

for平均每次运行时间(ms) :422.00

所有运行时长单位均为ms。综上测试结果,当数据量少于百万级别的,一次for循环来筛选数据效率更高,当数据量达到八万级别,还是使用stream来操作更加具有效率。但是小弟还是有点不明白原因是为何,求高人指点一二

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python多线程框架_基于python和bash的多线程任务框架 不要让cpu闲着了

[Bash shell] 纯文本查看 复制代码#! /bin/bash ########################################################################################################## #part1:defile your job&#xff08;第一部分&#xff0c;定义单核任务&#xff0c;需要根据你的实用任务改动&a…

FreeSWITCH第三方库(视频)的简单介绍(二)

FreeSWITCH使用了大量的第三方库&#xff0c;本文档主要介绍视频相关库的信息&#xff1a; 音频相关库的信息介绍参考&#xff1a;http://www.cnblogs.com/yoyotl/p/5486753.html 其他相关库的信息介绍参考&#xff1a;http://www.cnblogs.com/yoyotl/p/5489315.html ① openh2…

python单步调试的方法_python断点调试方法

pdb 是 python 自带的一个包&#xff0c;为 python 程序提供了一种交互的源代码调试功能&#xff0c;主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。pdb 提供了一些常用的调试命令&#xff0c;详情见表 1。下面结合具体的实例…

053(七十七)

381、 381.Which pseudo column could you use to identify a unique row in a Flashback Versions Query? A. XID B. VERSIONS_PK C. VERSIONS_XID D. VERSIONS_UNIQUE 382、 382.Which of the following can be used in conjunction with a Flashback Versions Query to fil…

java正则表达式 ppt_Java正则表达式演示

//正则表达式 regular expression regex//空白符有&#xff1a; ,\t,\n,\n,\r,\h;\s等于[\t\n\r\f];\S[^\t\n\r\f]// 常用的正则表达式//// 正则表达式 匹配//-------------------------------…

数加移动定向营销:如何快速搭建不完全依赖用户历史行为的个性化服务

移动定向营销是一款基于规则引擎面向移动应用做流量精准运营的数据服务&#xff0c;能帮助使用者灵活划分用户群体、细分用户流量。移动定向营销原理它是一种定向的、人为可控的、可解释的&#xff0c;并且不完全依赖于用户历史行为、不受投放内容约束、面向用户的个性化服务方…

python读写json_python 读写json数据

json 模块提供了一种很简单的方式来编码和解码JSON 数据。 字符串操作 其中两个主要的函数是json.dumps() 和json.loads() &#xff0c;要比其他序列化函数库如pickle 的接口少得多。下面演示 1.如何将一个Python 数据结构转换为JSON 2.如何将一个JSON 编码的字符串转换回一个P…

java web逻辑删除代码_MyBatis-Plus之逻辑删除的实现

特别是互联网项目&#xff0c;对于数据一般是不能删除的(涉及到后面的数据分析)&#xff0c;这就涉及到逻辑删除。所谓逻辑删除指的是数据并不是真正的删除&#xff0c;只是改数据表对应数据的状态(数据表中通常有一列叫delFlag,以此标识正常状态或删除状态)。逻辑删除一般都是…

debian安装java jdk_Linux(Centos、Debian)之安装Java JDK及注意事项(转)

a.因为Java JDK区分32位和64位系统&#xff0c;所以在安装之前必须先要判断以下我们的Centos、Debian系统为多少位系统&#xff0c;命令如下&#xff1a;uname -a解释&#xff1a;如果有x86_64就是64位的&#xff0c;没有就是32位的。后面是X686或X86_64则内核是64位的&#xf…

python程序化 k线指定时间更新_Python之路 14 K线时间序列管理器

在上一章中介绍了如何通过实时行情推送的Tick数据合成1分钟K线&#xff0c;并且如何通过1分钟K线来合成更大周期的K线。本章主要介绍如何将K线通过numpy缓存到Array&#xff0c;形成时间序列&#xff0c;并且同时生成一些技术指标。 首先 导入包 talib主要用于计算各种技术分析…

python手把手教程_【Python 1-7】Python手把手教程之——详解列表List

列表 作者 | 弗拉德 来源 | 弗拉德&#xff08;公众号&#xff1a;fulade_me) 列表&#xff0c;在其他语言中又被称为数组&#xff0c;是由一系列按特定顺序排列的元素组成。你可以创建包含字母表中所有字母、数字0~9或所有家庭成员姓名的列表。你也可以创建几个列表&#xff0…

[Typecho主题] modernist

Modernist 主题来自 Hexo. 是基于 modernist theme 修改 演示站点 安装 git clone https://github.com/uidea/typecho-theme-modernist.git themes/modernist 启用 外观 -> Modernist Theme -> 启用即可 更新 cd themes/modernist git pull 下载地址&#xff1a;https://…

python预定义_【Python】python类中方法的预定义

知乎问题&#xff1a;像这个图片里面显示的&#xff0c;self.prediction首先声明了下然后下面给出了定义&#xff0c;然后optimize又调用这个函数但是没有用self.prediction()这样的方式而是像用变量一样直接用self.prediction&#xff0c;,像请教一下这是什么操作&#xff1f;…

python md5加密_Python MD5加密实例详解

详解Python MD5加密 Python 3下MD5加密 # 由于MD5模块在python3中被移除 # 在python3中使用hashlib模块进行md5操作 import hashlib # 待加密信息 str this is a md5 test. # 创建md5对象 hl hashlib.md5() # Tips # 此处必须声明encode # 若写法为hl.update(str) 报错为&…

【IOS-COCOS2D-X 游戏开发之四】COCOS2DX创建ANDROID NDK新项目并编译导入ECLIPSE中正常运行!...

本站文章均为 李华明Himi 原创,转载务必在明显处注明&#xff1a; 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/645.html此篇针对较早的-x引擎讲解的&#xff0c;最新的可以参考&#xff1a; 【Cocos2d-X(2.x) 游戏开发系列之二】cocos2dx最新2…

2天后mysql_mysql 学习笔记 第二天

插入表格数据:Insert into table_name set columns_1value1,columns_2value2,对于没有赋值的列&#xff0c;将会取默认值&#xff0c;并且这个方法只能一次插入一个数据利用文本方式插入数据:Load data local infile‘径’into table table_name&#xff1b;Select 的通用形式:…

mysql查看日志命令_面对成百上千台服务器产生的日志,试试这款轻量级日志搬运神器!...

Filebeat简介Filebeat是一款轻量级日志采集器&#xff0c;可用于转发和汇总日志与文件。Filebeat内置有多种模块&#xff08;Nginx、MySQL、Redis、Elasticsearch、Logstash等&#xff09;&#xff0c;可针对常见格式的日志大大简化收集、解析和可视化过程&#xff0c;只需一条…

css 百分比 怎么固定正方形_css样式写出三角形,宽高自适应的正方形,扇形!...

闲来无事练习一下常见的css样式,希望大家能指点一二&#xff01;1用css实现一个三角形&#xff01;原理用border属性<!实现它的原理那就要弄明白border属性&#xff0c;border是一个复合属性border-width 指定边框的宽度border-style 指定边框的样式border-color 指定边框的…

用lsb_release -a 查看linux版本

1、要通过yum 安装上这个命令的软件包 yum -y install redhat-lsb 2、lsb_release -a 查看linux版本信息

java爬虫自动识别验证码_简单Java爬虫(一)爬取手机号码

原创 野狗菌 希望你能喜欢 今天关于本文&#xff1a;本文介绍一个简单Java爬虫&#xff0c;获取网页源码&#xff0c;爬取电话号码。本篇教程用我的博客一个测试网页演示。——野狗菌【希望你能喜欢】测试页面&#xff1a;https://www.wayteam.xyz/archives/phonenumber源代码&…