前言:
本文旨在对比一下循环遍历数组的三种方式的效率问题!(本文数据仅供参考)
如果你比较着急,或者不想看代码,直接到最后,但是建议你简单浏览代码!
三种方式,均为最常见的:
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,亲自测试一下!
任何别人的成果,对你来说只是参考意义,甚至有可能都是错的,所以勿以事小而不为!
启示
上述,只是对普通数组型集合做了对比,有兴趣的话,可以测试一下链表型的数据!两者之前的区别,数组是可以直接使用索引的,而链表不可以,对于遍历来说,这是很大的区别之处!