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