Java Stream:计数始终是计数吗?

它可能会出现明显的是,在计数的元素Stream需要较长时间的多个元素中有Stream 。 但实际上,
Stream::count有时可以在一个操作中完成,无论您有多少元素。 阅读本文并了解操作方法。

计数复杂度

Stream::count终端操作对a中的元素数进行计数
Stream 。 运算的复杂度通常为O(N) ,这意味着子运算的数量与运算中元素的数量成正比。
Stream

相反, List::size方法的复杂度为O(1) ,这意味着无论List中元素的数量如何, size()方法都会在恒定时间内返回。 通过运行以下JMH基准可以观察到这一点:

 @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(); }  } 

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

 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 
 <br> 

可以看出, List::size的吞吐量在很大程度上与List中元素的数量无关,而Stream::count的吞吐量随着元素数量的增加而Swift下降。 但是,实际上所有Stream实现本身总是如此吗?

源感知流

一些流实现实际上知道它们的源,并且可以采用适当的快捷方式并将流操作合并到流源本身中。 这可以极大地提高性能,尤其是对于大型流。 Speedment ORM工具允许将数据库视为Stream对象,并且这些流可以优化许多流操作,如Stream::count操作,如下面的基准所示。 我已使用开源Sakila示例数据库作为数据输入。 Sakila数据库包含有关租赁电影,艺术家等的全部信息。

 @State (Scope.Benchmark)  public class SpeedmentCountBenchmark { private Speedment app; RentalManager rentals; private RentalManager rentals; private FilmManager films; @Setup public void setup() { app = new SakilaApplicationBuilder() .withBundle(DataStoreBundle. class ) .withLogging(ApplicationBuilder.LogType.STREAM) .withPassword(ExampleUtil.DEFAULT_PASSWORD) .build(); app.get(DataStoreComponent. class ).ifPresent(DataStoreComponent::load); rentals = app.getOrThrow(RentalManager. class ); films = app.getOrThrow(FilmManager. class ); } @TearDown public void tearDown() { app.close(); } @Benchmark public long rentalsCount() { return rentals.stream().count(); } @Benchmark public long filmsCount() { return films.stream().count(); } public static void main(String[] args) throws RunnerException { Options opt = new OptionsBuilder() .include(SpeedmentCountBenchmark. class .getSimpleName()) .mode(Mode.Throughput) .threads(Threads.MAX) .forks( 1 ) .warmupIterations( 5 ) .measurementIterations( 5 ) .build(); new Runner(opt).run(); }  } 

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

 Benchmark                             Mode Cnt        Score         Error Units  SpeedmentCountBenchmark.filmsCount   thrpt 5 71037544.648 ± 75915974.254 ops/s  SpeedmentCountBenchmark.rentalsCount thrpt 5 69750012.675 ± 37961414.355 ops/s 
 <br> 
 <br> 

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

注意:上面的基准测试是通过Speedment的“ DataStore” JVM虚拟机内存加速来运行的。 如果直接对数据库没有加速运行,则响应时间将取决于基础数据库执行“SELECT count(*) FROM film”查询的能力。

摘要

可以创建在单个操作中对元素进行计数的Stream实现,而不是对流中的每个元素进行计数。 这可以显着提高性能,尤其是对于具有许多元素的流。

资源资源

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-count-always-count.html

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

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

相关文章

【渝粤教育】国家开放大学2018年春季 0269-22T文学概论 参考试题

试卷代号&#xff1a;0269 2017-2018年度第二学期考试 文学概论试题 2018年7月 一、选择题&#xff08;请在下面的答题框内写上正确答案的序号&#xff09;&#xff08;每小题3分&#xff0c;共30分&#xff09; 1&#xff0e;在魏晋时期&#xff0c;南朝宋文帝建立“四学”即…

工业以太网的冗余功能有哪些?

由于工业环境对工业控制网络可靠性能的超高要求&#xff0c;工业以太网的冗余功能应运而生。从快速生成树冗余(RSTP)、环网冗余&#xff08;RapidRing&#xff09;到主干冗余&#xff08;Trunking&#xff09;&#xff0c;都有各自不同的优势和特点&#xff0c;控制工程师们可以…

支付宝回调地址index.php,支付宝支付成功回调地址怎么不改变当前页面?

手机端支付宝支付成功后 会有一个回调地址"http://pay.xxx.com/channel/alipayWap/return_url.php?is_successT&notify_idRqPnCoPT3K9%252Fvwbh3Ih20EPHd%252B9cnawdN%252Bu%252FVdQAMTpw%252FtTBJga49sLEne6jOnYt2mSr&notify_time2017-08-0814%3A41%3A49&no…

【渝粤教育】国家开放大学2018年春季 0434-22T高级英语口语 参考试题

科目编号&#xff1a;0434 2017-2018学年第二学期期末考试 高级英语口语 试题 2018年7月 (3—1) Ⅰ. Contradict the following statement. &#xff08;反驳下列论断&#xff09;。 (30 %) Whether to have many children or not is a completely private matter. Ⅱ. Make a…

input发送a.jax_JAX-RS 2.0:自定义内容处理

input发送a.jax我试图想到一个更好的标题&#xff0c;但未能拿出一个&#xff01; 请多多包涵……。 JAX-RS 2.0规范允许我们无缝地将JAXB对象编组到HTTP请求/响应主体&#xff0c;或从HTTP请求/响应主体中解组。 简而言之&#xff0c;我们可以使用域对象&#xff0c;而不必担…

php mysql ppt,7PHP访问数据库分析.ppt

7PHP访问数据库分析习题 4. 下列哪个函数可以将结果集的指针移动到指定的位置 A. mysql_fetch_rowB. mysql_fetch_assoc C. mysql_queryD. mysql_data_seek 5. PHP连接mysql数据库的连接函数mysql_connect的第三个参数是&#xff1a;() A. 主机名B. 数据库密码C. 数据库用户名 …

工业以太网交换机出现温度过高如何处理?

工业交换机由于其良好的通信性能、超强的抗磁抗干扰性被应用在工业环境下。我们都知道工业环境是很恶劣的&#xff0c;加上工业交换机要连续不间断的工作&#xff0c;很容易造成工业交换机过热的现象&#xff01;因此除了产品本身采用宽温度范围的元器件之外&#xff0c;我们更…

【渝粤教育】国家开放大学2018年春季 0556-21T广告摄影 参考试题

编号&#xff1a;0556 座位号 2017&#xff5e;2018学年度第二学期期末考试 广告摄影 试题 2018年6月 一、名词解释&#xff08;每小题5分,共15分&#xff09; 广告摄影&#xff1a; 曝光的互易律&#xff1a; 景别&#xff1a; 广告摄影试题第1页…

【渝粤教育】国家开放大学2018年春季 0675-22T中级财务会计(2) 参考试题

科目编号&#xff1a;0675 座位号 2017-2018学年度第二学期期末考试 中级财务会计&#xff08;2&#xff09; 试题 2018年 7 月 一、单选题&#xff08;本大题共10小题&#xff0c;每小题3分&#xff0c;共计30分&#xff09; &#xff08;★请考生务必将答案填入到下面对应序…

如何将Java应用程序置于Apache HTTP服务器之后

在过去 &#xff0c;将Apache HTTP服务器置于Java应用程序服务器或Java应用程序本身的前面是很常见的事情。 其背后的原因非常简单&#xff0c;可以以简单的方式添加缓存&#xff0c;还可以添加负载平衡&#xff0c;并且在此静态内容之上可以由Apache HTTP提供服务&#xff0c…

【渝粤教育】国家开放大学2018年春季 0703-22T经济学基础 参考试题

科目编号&#xff1a;0703 座位号 □□ 2017-2018学年度第二学期期末考试 经济学基础 试题 2018年7月 一、单项选择题&#xff1a;&#xff08;每题4分&#xff0c;共40分&#xff09; 一个经济体系必须回答的基本问题&#xff08; &#xff09; A&#xff0e;生产什么&#…

工业以太网交换机的概念及其主要功能介绍

随着互联网技术的快速发展&#xff0c;工业以太网在工业的通信领域也在大展身手&#xff0c;工业以太网交换机作为重要的通信设备&#xff0c;在整个工业通信行业中有着极其重要的功能&#xff01;下面&#xff0c;飞畅科技的小编就来为大家详细介绍一下什么是工业以太网交换机…

php 设置统一处理错误,统一的PHP错误处理理论

我建议去“异常”的方式。当有用户错误时抛出异常&#xff0c;您可以将php错误转换为异常&#xff0c;如下所示&#xff1a;function exception_error_handler($errno, $errstr, $errfile, $errline ) {throw new ErrorException($errstr, 0, $errno, $errfile, $errline);}set…

【渝粤教育】国家开放大学2018年春季 3950T金融基础 参考试题

试卷代号&#xff1a;3950 金融基础 试题 2018年7月 一、单项选择题&#xff08;每小题2分&#xff0c;共20分&#xff0c;每小题有一项答案正确&#xff0c;请将正确答案的序号填写在括号内&#xff09; 1&#xff0e;商业银行不用或少用自有资金&#xff0c;代客户办理收付或…

mockito接口_什么是Mockito Extra接口?

mockito接口如果要编写轻量级的JUnit测试&#xff0c; Mockito是我最喜欢的小帮手。 如有必要&#xff0c;可以通过模拟轻松地替换被测单元的“实际”依赖关系&#xff0c;这非常有用。 特别是在处理框架API的边界时&#xff0c;这种依赖关系否则设置起来非常昂贵。 但是有时候…

【渝粤教育】国家开放大学2018年春季 7392-22FMatlab语言及其应用 参考试题

科目编号&#xff1a;7392 2017-2018学年度第二学期期末考试 Matlab语言及其应用 试题&#xff08;式样&#xff09; 命题人&#xff1a;冯立 审核人&#xff1a; 部门领导&#xff1a; 考核方式 开 卷&#xff0c;考核时间 60 分钟&#xff0c;本题共 2 套&#xff0c;第 2 …

Zigbee 电动智能窗帘系统 解决方案

随着社会经济结构、家庭人口结构以及信息技术的发展变化以及人类对家居环境的安全性、舒适性、效率性要求的提高&#xff0c;造成家居智能化的需求大大增加&#xff0c; 同时越来越多的家庭要求智能家居产品不仅要满足一些基本的需求&#xff0c;更要求智能家居系统在功能扩展、…

工业以太网交换机的专业术语

工业以太网交换机与民用以太网交换机相比&#xff0c;工业以太网交换机产品在设计上以及在元器件的选用上&#xff0c;产品的强度和适用性方面都能满足工业现场的需要。接下来&#xff0c;我们就来为大家详细介绍下工业以太网交换机的一些常用专业术语&#xff0c;一起来看看吧…

【渝粤教育】国家开放大学2018年春季 8039-22T二手车评估 参考试题

科目编号&#xff1a;8039 座位号 2017-2018学年度第二学期期末考试 二手车评估 试题 2018年 7 月 一、不定项选择题&#xff08;本大题共6小题&#xff0c;每小题5分&#xff0c;共计30分&#xff09; &#xff08;★请考生务必将答案填入到下面对应序号的答题框中★&#xf…

oracle utf8 varchar,Oracle中字符集的类型决定varchar2的字符长度

1.前几天往数据库表里面插入数据的报了一个这样的错误如下&#xff1a;SQL> insert into student values(中华人民共和,60);insert into student values(中华人民共和,60)*第 1 行出现错误:ORA-12899: 列 "SYSTEM"."STUDENT"."NAME" 的值太大…