#代码实例
package tech.zhuyuan.demo.designpattern.iterator.concurrent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* 5种迭代方式
*/
public class FiveKindsOfIterationPerfTest {
/**
* 生成指定数量的从1-n的列表
*
* @param n
* @return
*/
protected static List<Integer> generateNumList(int n) {
List<Integer> list = new ArrayList<>();
for (int i = 1; i <= n; i++) {
list.add(1);
}
return list;
}
/**
* for循环原始方式
*
* @param list
*/
private static long showFor(List<Integer> list) {
long start = System.nanoTime();
for (int i = 0; i < list.size(); i++) {
Integer clone = list.get(i);
}
long end = System.nanoTime();
return end - start;
}
/**
* for循环原始方式改进
*
* @param list
*/
private static long showAdvancedFor(List<Integer> list) {
long start = System.nanoTime();
for (int i = 0, size = list.size(); i < size; i++) {
Integer clone = list.get(i);
}
long end = System.nanoTime();
return end - start;
}
/**
* Iterator(迭代器) JDK 1.2增加
*
* @param list
*/
private static long showIterator(List<Integer> list) {
long start = System.nanoTime();
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
Integer clone = it.next();
}
long end = System.nanoTime();
return end - start;
}
/**
* 增强版for循环 JDK 1.5增加,需要实现java.util.Iterable接口
*
* @param list
*/
private static long showEnhancedFor(List<Integer> list) {
long start = System.nanoTime();
for (Integer num : list) {
Integer clone = num;
}
long end = System.nanoTime();
return end - start;
}
/**
* foreach JDK 1.8 添加
*
* @param list
*/
private static long showForeach(List<Integer> list) {
long start = System.nanoTime();
list.forEach(o -> {
});
long end = System.nanoTime();
return end - start;
}
public static void main(String[] args) {
int n = 10;
List<Integer> list = generateNumList(n);
System.out.println(n + ": \t" + showFor(list) + "\t"
+ showAdvancedFor(list) + "\t"
+ showIterator(list) + "\t"
+ showEnhancedFor(list)
+ "\t" + showForeach(list));
}
}
#比较结果
列表采用ArrayList,如果是LinkedList效果将会很不一样。ArrayList和LinkedList分别对应数据结构的线性表和单链表,在CRUD各种操作上性能本身就不一样。
测试结果仅供参考,由于计算机本身性能问题会导致结果不同,而且多次执行结果也是不同的,偶尔还会出现某一个值特别高的情况,这些暂且不谈。
执行时间为纳秒。
| 类型\size | 10 | 100 | 1000 | 10,000| 100,000 | 1,000,000 | 10,000,000
| ------------- |:-------------😐 -----😐 -----😐 -----😐 -----😐 -----😐
| showFor | 5,287 | 19,905 | 107,924 | 685,482 | 3,819,917 | 6,844,563 | 13,006,441
| showAdvancedFor | 933 | 12,441 | 72,778 | 336,521 | 2,350,670 | 5,247,799 | 9,558,190
| showIterator | 19,283 | 35,145 | 167,950 | 862,763 | 3,925,352 | 7,340,946 | 14,012,272
| showEnhancedFor | 1,886 | 15,551 | 130,005 | 544,592 | 3,675,294 | 7,628,327 | 14,236,827
| showForeach | 37,434,690 | 39,432,978 | 40,047,237 | 37,935,117 | 43,071,883 | 44,288,272 | 46,217,203
#总结
- 改进版for循环性能最好
- java 8 forEach性能最差,其次最差的是Iterator(迭代器模式)
- 数据量很小的话普通的for循环没有增强版for循环好,但是当数据量很大差别不大。
个人建议:一般数据量可以直接选择增强版for循环,数据量很大的时候使用改进版for循环。使用增强版for循环理由是书写简单,程序改造时降低耦合度。