循环遍历数组(集合)的几种方式的效率测试

前言:

本文旨在对比一下循环遍历数组的三种方式的效率问题!(本文数据仅供参考)

如果你比较着急,或者不想看代码,直接到最后,但是建议你简单浏览代码!

三种方式,均为最常见的:

1.普通for循环遍历

2.增强for循环遍历

3.迭代器方法遍历

废话不多说,先看测试代码:

    public static void main(String[] args)
    {
        //得到被测试集合
        List<String> testList = buildArray();

        long timeBegin,timeEnd,diffValue;
        //存储每一次测试的时间,为了重复循环测试,计算平均值
        TLongArrayList longList = new TLongArrayList();

        for(int m = 0; m < 100; m++)
        {
            timeBegin = System.nanoTime();
            //traversalFor(testList);
            //traversalForPlus(testList);
            traversalForIterator(testList);
            timeEnd = System.nanoTime();
            diffValue = timeEnd - timeBegin;
            longList.add(diffValue);
        }
        System.out.println(getAverage(longList));
    }

简单对上述代码说明:

我们测试的时候,每种方式循环遍历100次,求100次的平均值,然后执行三次代码,测试三组!

上述buildArray为生成被测试数组,简单代码如下:.

(代码中的数值,是测试数组的大小数据量,本文测试了100--1000w不同量级下的数据)

测试平均值代码如下:

代码很简单,了解下测试过程,来看测试数据

 

方式

第一次

第二次

第三次

数据量:100

每一次结果都是循环100次测试,求平均时间(单位:nm)

普通for循环

6890

7038

6301

增强for循环

25675

15326

11673

迭代器遍历

13203

10274

11445

方式

第一次

第二次

第三次

数据量:1K

每一次结果都是循环100次测试,求平均时间(单位:nm)

普通for循环

28442

27191

33327

增强for循环

39878

44410

40095

迭代器遍历

48512

36194

39362

方式

第一次

第二次

第三次

数据量:1W

每一次结果都是循环100次测试,求平均时间(单位:nm)

普通for循环

88608

72092

76667

增强for循环

103957

107508

103793

迭代器遍历

97942

102443

111384

方式

第一次

第二次

第三次

数据量:10W

每一次结果都是循环100次测试,求平均时间(单位:nm)

普通for循环

123168

119416

124257

增强for循环

153890

159249

161234

迭代器遍历

159884

157636

163213

方式

第一次

第二次

第三次

数据量:100W

每一次结果都是循环100次测试,求平均时间(单位:nm)

普通for循环

687960

809371

692268

增强for循环

811477

848861

826338

迭代器遍历

914350

903433

832230

方式

第一次

第二次

第三次

数据量:1000W

每一次结果都是循环100次测试,求平均时间(单位:nm)

普通for循环

5868430

5855044

5917324

增强for循环

7226580

7497605

7356800

迭代器遍历

7456213

7913889

7290302

解释说明 :

以上内容,仅供参考!数据在不同的环境,不同的pc配置或者jdk版本下,甚至同一环境的不同测试中都会有浮动,这很正常!我们不应该纠结于数据到底有多么大的精确度,我们只是根据相对较多测试下的情况,受到一些启示:

1.三种情况从数据量100到1000万的量级对比下,差距都不是很大,很接近(如果,你不能理解这句话的意思,或者说你认为差距还是比较大的,我只能说,nm的单位,要么就是你不知道,要么就是你没有这个时间级的概念,或者你没有仔细看,忽略了这个单位,哈哈,开个玩笑!)。

2.三种情况的绝大多数对比,普通for循环的效率相对好一点。

3.增强for循环和迭代器的方式,在数据量小的时候,迭代器稍微好一点,数据量上升到比较大的量级的时候,增强for循环稍微优秀

4.再次说明,本文只是一个参考意义的数据分析,我们聚焦于数据对比,而不是数值本身!

补充说明:

本文只是一个简单的记录,无关原理解析:但是还是为彼此提供一个学习方向:

通过class字节码和反编译,我们能够看到增强for循环遍历的代码实现本质,其实就是使用了迭代器,所以说纵观整个数据测试分析,增强for循环和迭代器的循环遍历方法,都相差不大,最为接近!!!

如果你足够敏感,你会马上想到,增强for循环的使用条件,是数组和实现了collection接口的实现类,现在应该明白为什么了吧,因为collection实现了Iterable接口,也就是使用迭代器的条件!!!

此处,只是作为个学习方向,具体深入内容,自行研究!!!

最后

不要认为很简单,或者事情很小,而觉得没有必要做!

笔者,之所以进行这个简单的测试,就是因为查找博客的时候,良莠不齐,没有一个博客是比较满意的,大部分代码都不给,直接上一组数据,还有的代码对每种情况,仅测试一次,还纠结于数值本身,笔者深感郁闷,最终还是亲测,做一个简单的记录。

之所以,代码以截图的形式展示,就是想让看到的人,自己亲自写一个自己的测试demo,亲自测试一下!

任何别人的成果,对你来说只是参考意义,甚至有可能都是错的,所以勿以事小而不为!

启示

上述,只是对普通数组型集合做了对比,有兴趣的话,可以测试一下链表型的数据!两者之前的区别,数组是可以直接使用索引的,而链表不可以,对于遍历来说,这是很大的区别之处!

猜你喜欢

转载自blog.csdn.net/romantic_jie/article/details/103385740