stream分组计数_Java Stream:第2部分,计数始终是计数吗?

stream分组计数

在上一篇有关该主题的文章中 ,我们了解到JDK 8
stream()::count需要更长的时间来执行Stream更多的元素。 对于最新的JDK(例如Java 11),简单的流管道不再是这种情况。 了解JDK本身如何进行改进。

Java 8

在上一篇文章中,我们可以得出结论:
list.stream().count()在Java 8下为O(N) ,即执行时间取决于原始列表中的元素数。 阅读文章
在这里 。

Java 9及更高版本

正如Nikolai Parlog(@nipafx)和Brian Goetz(@BrianGoetz)在Twitter上正确指出的那样 ,从Java 9开始改进了Stream::count的实现。下面是对底层代码的比较
Java 8和更高Java版本之间的Stream::count代码:

Java 8(来自ReferencePipeline类)

 return mapToLong(e -> 1L).sum(); 

Java 9及更高版本(来自ReduceOps类)

 if (StreamOpFlag.SIZED.isKnown(flags)) { return spliterator.getExactSizeIfKnown();  } 
 ... 

它出现Stream::count用Java 9和更高版本是O(1)已知大小的Spliterators而不是O(N) 让我们验证该假设。

基准测试

可以通过在Java 8和Java 11下运行以下JMH基准来观察big-O属性:

 @State (Scope.Benchmark)  public class CountBenchmark { private List<Integer> list; @Param ({ "1" , "1000" , "1000000" }) private int size; @Setup public void setup() { list = IntStream.range( 0 , size) .boxed() .collect(toList()); } @Benchmark public long listSize() { return list.size(); } @Benchmark public long listStreamCount() { return list.stream().count(); } public static void main(String[] args) throws RunnerException { Options opt = new OptionsBuilder() .include(CountBenchmark. class .getSimpleName()) .mode(Mode.Throughput) .threads(Threads.MAX) .forks( 1 ) .warmupIterations( 5 ) .measurementIterations( 5 ) .build(); new Runner(opt).run(); }  } 

这将在我的笔记本电脑(MacBook Pro 2015年中,2.2 GHz Intel Core i7)上产生以下输出:

JDK 8(来自上一篇文章)

 Benchmark                       (size)  Mode Cnt         Score          Error Units  CountBenchmark.listSize 1 thrpt 5 966658591.905 ± 175787129.100 ops/s  CountBenchmark.listSize 1000 thrpt 5 862173760.015 ± 293958267.033 ops/s  CountBenchmark.listSize 1000000 thrpt 5 879607621.737 ± 107212069.065 ops/s  CountBenchmark.listStreamCount 1 thrpt 5 39570790.720 ± 3590270.059 ops/s  CountBenchmark.listStreamCount 1000 thrpt 5 30383397.354 ± 10194137.917 ops/s  CountBenchmark.listStreamCount 1000000 thrpt 5 398.959 ± 170.737 ops/s 

JDK 11

 Benchmark                                 (size)  Mode Cnt         Score          Error Units  CountBenchmark.listSize 1 thrpt 5 898916944.365 ± 235047181.830 ops/s  CountBenchmark.listSize 1000 thrpt 5 865080967.750 ± 203793349.257 ops/s  CountBenchmark.listSize 1000000 thrpt 5 935820818.641 ± 95756219.869 ops/s  CountBenchmark.listStreamCount 1 thrpt 5 95660206.302 ± 27337762.894 ops/s  CountBenchmark.listStreamCount 1000 thrpt 5 78899026.467 ± 26299885.209 ops/s  CountBenchmark.listStreamCount 1000000 thrpt 5 83223688.534 ± 16119403.504 ops/s 

可以看出,在Java 11中, list.stream().count()操作现在是
O(1)而不是O(N)

Brian Goetz 指出 ,一些在Java 8下使用Stream::peek方法调用的开发人员发现,如果Stream::count终端操作在Java 9及更高版本下运行,则不再调用这些方法。 这给JDK开发人员带来了一些负面反馈。 就个人而言,我认为这是JDK开发人员的正确决定,相反,这为
Stream::peek用户使他们的代码正确。

更复杂的流管道

在本章中,我们将介绍更复杂的流管道。

JDK 11

塔吉尔·瓦列夫(Tagir Valeev) 得出结论 ,对于List::stream ,类似stream().skip(1).count()类的管道不是O(1)

通过运行以下基准可以观察到这一点:

 @Benchmark  public long listStreamSkipCount() { return list.stream().skip( 1 ).count();  } 
 CountBenchmark.listStreamCount 1 thrpt 5 105546649.075 ± 10529832.319 ops/s  CountBenchmark.listStreamCount 1000 thrpt 5 81370237.291 ± 15566491.838 ops/s  CountBenchmark.listStreamCount 1000000 thrpt 5 75929699.395 ± 14784433.428 ops/s  CountBenchmark.listStreamSkipCount 1 thrpt 5 35809816.451 ± 12055461.025 ops/s  CountBenchmark.listStreamSkipCount 1000 thrpt 5 3098848.946 ± 339437.339 ops/s  CountBenchmark.listStreamSkipCount 1000000 thrpt 5 3646.513 ± 254.442 ops/s 

因此, list.stream().skip(1).count()仍为O(N)。

加速

一些流实现实际上知道它们的源,并且可以采用适当的快捷方式并将流操作合并到流源本身中。 这可以大大提高性能,尤其是对于具有更复杂的流管道(例如stream().skip(1).count()大型流stream().skip(1).count()

Speedment ORM工具允许将数据库视为Stream对象,并且这些流可以优化许多流操作,例如
Stream::countStream::skipStream::limit操作,如下面的基准所示。 我已使用开源Sakila示例数据库作为数据输入。 Sakila数据库包含有关租赁电影,艺术家等的全部信息。

 @Benchmark  public long rentalsSkipCount() { return rentals.stream().skip( 1 ).count();  }  @Benchmark  public long filmsSkipCount() { return films.stream().skip( 1 ).count();  } 

运行时,将产生以下输出:

 SpeedmentCountBenchmark.filmsSkipCount       N/A thrpt 5 68052838.621 ± 739171.008 ops/s  SpeedmentCountBenchmark.rentalsSkipCount     N/A thrpt 5 68224985.736 ± 2683811.510 ops/s 

“租赁”表包含10,000行,而“电影”表仅包含1,000行。 但是,它们的stream().skip(1).count()操作几乎同时完成。 即使一个表包含一万亿行,它仍然会在相同的经过时间内对元素进行计数。 因此, stream().skip(1).count()实现的复杂度为O(1)而不是O(N)

注意:上面的基准测试是通过“ DataStore” JVM内存中加速来运行的。 如果直接对数据库没有加速运行,则响应时间将取决于基础数据库执行嵌套“SELECT count(*) …”语句的能力。

摘要

在Java 9中Stream::count显着提高。

有些流实现(例如Speedment O(1)即使在更复杂的流管道(如stream().skip(...).count()甚至stream.filter(...).skip(...).count() stream().skip(...).count()中也能够以O(1)时间计算Stream::count stream().skip(...).count() stream.filter(...).skip(...).count()

资源资源

Speedment Stream ORM初始化程序: https ://www.speedment.com/initializer/

Sakila: https ://dev.mysql.com/doc/index-other.html或https://hub.docker.com/r/restsql/mysql-sakila

翻译自: https://www.javacodegeeks.com/2019/04/java-stream-part-2-count-always-count.html

stream分组计数

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

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

相关文章

女生学计算机类什么专业好就业前景,2019高考:适合女生报考的10大专业!就业前景好,待遇稳定!...

如今考大学不再是单纯的提升学历&#xff0c;也要为自己未来的工作考虑。尤其是女生&#xff0c;更要考虑就业问题。因为很多专业都不太适合女生去做&#xff0c;甚至都不招收女生。不过也有其他的专业很适合女生&#xff0c;不仅就业前景好&#xff0c;而且很好找工作&#xf…

macOS安装Maven_IDEA集成Maven

文章目录下载 Maven安装 Maven配置环境变量关于 settings.xml 文件配置本地仓库Maven 默认的远程中央仓配置镜像仓库IntelliJ IDEA 集成 Maven下载 Maven 官方下载地址&#xff1a;https://maven.apache.org/download.cgi 打开官方下载页面&#xff0c;页面拖到下面&#xff…

bootstrap样式异常_处理异常功能样式

bootstrap样式异常Java从一开始就支持检查异常。 在Java 8中&#xff0c;语言元素lambda和支持流操作的RT库修改将功能编程风格引入了该语言。 函数样式和异常并不是真正的好朋友。 在本文中&#xff0c;我将描述一个简单的库&#xff0c;该库在某种程度上类似于使用Optional处…

无线鼠标可以强制配对_赛睿Rival 3 Wireless游戏鼠标评测:无限全能

近两年&#xff0c;外设无线技术日渐成熟&#xff0c;也让无线外设产品出现了爆发式增长。随着无线外设产品开始在职业赛场上崭露头角&#xff0c;让越来越多的用户更加青睐便利性与体验感极佳的无线外设产品。赛睿作为老牌外设厂商&#xff0c;在2018年就推出了采用双传感器并…

clear nTotal nNum=1计算机考试,信息学奥赛常考算法——模拟法

★模拟法有些问题的描述和解决方法已经很清楚&#xff0c;只需要按照描述去一步一步的执行即可&#xff0c;这种方法就是计算机解决问题的一种最普遍最直接的方法------模拟法。模拟法并不是程序&#xff0c;只是我们依赖计算机的运算速度解决问题的一种方法或模式&#xff0c;…

junit 测试目录_JUnit 5测试中的临时目录

junit 测试目录JUnit 4 TemporaryFolder Rule允许开发人员使用临时目录创建测试。 使用JUnit 5时&#xff0c;不支持Rule因此测试文件和目录需要一点点额外的工作。 幸运的是&#xff0c;有了JUnit 5.4&#xff0c;有一个新的内置扩展可以处理测试中的临时目录。 而且它非常易于…

IntelliJ IDEA内置Maven的settings.xml文件在哪里?

IDEA 内置的 Maven 没有 settings.xml 文件&#xff0c;如果你自己不安装 Maven&#xff0c;而你又想设置 Maven 的资源仓库&#xff0c;你要怎么做呢&#xff1f; 参见&#xff1a;https://blog.csdn.net/Li_Ya_Fei/article/details/104432073

java生成唯一有序序列号_分布式唯一 ID 之 Snowflake 算法

SegmentFault 社区专栏&#xff1a;全栈修仙之路作者&#xff1a;semlinkerNo.1Snowflake 简介1.1 什么是 SnowflakeSnowflake is a service used to generate unique IDs for objects within Twitter (Tweets, Direct Messages, Users, Collections, Lists etc.). These IDs a…

冀教版五年级计算机教学计划,冀教版五年级上册教学计划资料

现状分析:五年级两个班现有学生四十余人,基本为我校四年级直升学生.已学习了北师大版《语文》五年级上册和冀教版《语文》五年级下册.目前普遍情况是听、写的能力尚可,读和说的能力有待提高.一班学生基础知识较为扎实,但缺乏变通性,学习较为用功,但成绩不佳&#xff1b;二班学生…

spring缓存_有关Spring缓存性能的更多信息

spring缓存这是我们最后一篇关于Spring的缓存抽象的文章的后续文章 。 作为工程师&#xff0c;您可以通过了解所使用的某些工具的内部知识来获得宝贵的经验。 了解工具的行为有助于您在做出设计选择时变得更加成熟。 在本文中&#xff0c;我们描述了基准测试实验和结果&#x…

提交构件到Maven的远程中央仓

参见&#xff1a;https://central.sonatype.org/publish/publish-guide/

ctrl导致开机弹出计算机,Win7系统开机黑屏提示Press Ctrl+Alt+Del to restart如何解决...

在使用win7系统的时候&#xff0c;难免会遇到各种各样的问题&#xff0c;比如最近有雨林木风win7旗舰版系统用户反映说开机黑屏&#xff0c;并提示Press CtrlAltDelto restart&#xff0c;该怎么解决这样的问题呢&#xff0c;现在给大家分享一下Win7系统开机黑屏提示PressCtrlA…

rxjava背压怎样使用_使用MicroProfile应用隔板和背压

rxjava背压怎样使用我录制了一段视频&#xff0c;介绍如何使用MicroProfile Fault Tolerance实现隔板和背压。 隔板后面的想法是将应用程序分成几个隔离功能的执行单元。 在企业Java应用程序中&#xff0c;这通常意味着定义多个线程池。 向客户端施加背压会导致向客户端添加有…

单片机蜂鸣器编程音乐_基于单片机的智能鱼缸温控系统设计

曹益豪聊城大学东昌学院机电工程系山东 聊城 252000摘 要&#xff1a;为满足热带鱼的饲养要求&#xff0c;设计了一种基于AT89C52单片机的小型智能温控鱼缸系统。该系统利用DS18B20传感器检测水温&#xff0c;并通过测量温度与设定温度的对比控制加热装置的通断。现详细介绍了…

计算机快捷键 还原默认值,CAD默认快捷键如何恢复?教你还原CAD默认配置的方法...

小编告诉大家AutoCAD的操作命令和各种设置分为默认和自定义。 可以根据每个人的喜好进行设置。 不必完全遵循该软件的默认操作&#xff0c;只是因为此快捷键是可变的&#xff0c;所以我仍然不习惯更改我的个人操作&#xff0c;并且想要恢复为默认设置&#xff0c;我们如何还原它…

java开发指南_Java 12新功能完整指南

java开发指南六个月飞得如此之快&#xff0c;是时候再次仔细研究一下即将发布的新JDK版本。 让我们满足Java 12及其向开发人员介绍的功能。 自Oracle推出加速六个月的发布节奏以来已经有一段时间了&#xff0c;要跟上每个版本及其添加到表中的功能越来越难了。 从好的方面来看…

python语句join_Python中的join()函数的用法

函数&#xff1a;string.join() Python中有join()和os.path.join()两个函数&#xff0c;具体作用如下&#xff1a; join()&#xff1a;连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串 os.path.join()&#xff1a;将多个路径组合后返…

怎么升级计算机内存容量,如何升级电脑内存?给电脑内存升级的操作步骤

电脑内存是用来作为临时存储数据设备使用的&#xff0c;如果内存占用率高&#xff0c;会让电脑运行负荷。喜欢玩游戏的人对电脑内存要求都比较高。很多玩家在购机时内存选择并不大&#xff0c;一般都是标配8G及以下&#xff0c;那么如何升级电脑内存&#xff1f;下面就和大家一…