博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实现Java集合迭代的高性能
阅读量:6489 次
发布时间:2019-06-24

本文共 1944 字,大约阅读时间需要 6 分钟。

版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/81042018

实现Java集合迭代的高性能

  • 2018.7.14
  • 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。

一、介绍

Java开发者经常会遇到处理集合(比如ArrayList、HashSet)的情况,Java 8也提供了Lambda表达式和Streaming API来简化集合相关的工作。在大多数应用场景下,无需考虑集合迭代的性能消耗。但是,在一些极端情况下,比如集合包含了上百万条记录的情况,这个时候集合迭代就需要选择正确的姿势,否则性能会较差。

使用JMH检查下面每段代码片段的运行时间。

二、forEach vs. C Style vs. Stream API

迭代是一个非常基本的功能,所有的编程语言都有简单的迭代语法,允许程序员在集合上运行迭代。Stream API可以通过Collections用非常直接的方式进行迭代。

public List
streamSingleThread(BenchMarkState state) { List
result = new ArrayList<>(state.testData.size()); state.testData.stream().forEach(item -> { result.add(item); }); return result;}public List
streamMultiThread(BenchMarkState state) { List
result = new ArrayList<>(state.testData.size()); state.testData.stream().parallel().forEach(item -> { result.add(item); }); return result;}

使用forEach循环也非常简单:

public List
forEach(BenchMarkState state) { List
result = new ArrayList<>(state.testData.size()); for(Integer item : state.testData) { result.add(item); } return result;}

C style方式的迭代其代码要冗长一些,但仍然非常紧凑:

public List
forCStyle(BenchMarkState state) { int size = state.testData.size(); List
result = new ArrayList<>(size); for(int j = 0; j < size; j ++){ result.add(state.testData.get(j)); } return result;}

以上代码的性能评分如下:

Benchmark Mode Cnt Score Error Units
TestLoopPerformance.forCStyle avgt 200 18.068 ± 0.074 ms/op
TestLoopPerformance.forEach avgt 200 30.566 ± 0.165 ms/op
TestLoopPerformance.streamMultiThread avgt 200 79.433 ± 0.747 ms/op
TestLoopPerformance.streamSingleThread avgt 200 37.779 ± 0.485 ms/op

对于C style方式的迭代,JVM只是简单地增加了一个整型变量,它直接从内存读值。这使它非常快。但forEach迭代则不同,根据Oracle官方文档,JVM必须把forEach转换为迭代器并为每个数据项调用hasNext()。这就是为什么forEach比C style

你可能感兴趣的文章
swift unowned和weak的使用
查看>>
面向对象设计原则
查看>>
异步编程 101: 是什么、小试Python asyncio
查看>>
10月12日云栖精选夜读:【直击2017杭州·云栖大会】TECH INSIGHT企业迁云实战专场...
查看>>
html中在线预览pdf文件之pdf在线预览插件
查看>>
MongoDB入门篇
查看>>
Java 集合08之 ListLinkedList, ArrayList等使用场景和性能分析
查看>>
短期怎么学会云计算?新手学习云计算的规划
查看>>
支配vue框架之模版语法 v-html
查看>>
英伟达发布超强大新型芯片用于人工智能
查看>>
以太坊社区激励金计划:支持开发者利用去中心化技术改变世界
查看>>
详细精确阐述jsBridge执行流程的文章
查看>>
并发编程导论
查看>>
使用AndroidX + ViewModel + LiveData + DataBinding等组件搭建的MVVM快速开发框架
查看>>
[译] 关于 React Router 4 的一切
查看>>
Python虚拟环境指南2019版
查看>>
[译] 移动界面设计的 10 项启发式原则
查看>>
Git自学成才——Pull Request
查看>>
Python2和Python3 urllib对照表
查看>>
凭什么说这是前端最好的时代?
查看>>