实现Java集合迭代的高性能

版权声明:本文为博主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<Integer> streamSingleThread(BenchMarkState state) {
    List<Integer> result = new ArrayList<>(state.testData.size());
    state.testData.stream().forEach(item -> {
        result.add(item);
    });
    return result;
}

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

使用forEach循环也非常简单:

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

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

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

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

BenchmarkModeCntScoreErrorUnits
TestLoopPerformance.forCStyleavgt20018.068± 0.074ms/op
TestLoopPerformance.forEachavgt20030.566± 0.165ms/op
TestLoopPerformance.streamMultiThreadavgt20079.433± 0.747ms/op
TestLoopPerformance.streamSingleThreadavgt20037.779± 0.485ms/op

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值