性能准则之一:在遍历集合前一定要判断集合是否为空
例举2个例子:
1使用Iterator对象遍历集合时,此时遍历前检查集合大小可以缩短执行时间约为:64%
public static void main(String[] args) {
int N = 1000 * 100000;
List<Integer> list = new ArrayList<Integer>();
long start = System.currentTimeMillis();
for (int i = 0; i < N; i++) {
Iterator<Integer> iter = list.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
}
System.out.println(System.currentTimeMillis() - start); //==================490
start = System.currentTimeMillis();
for (int i = 0; i < N; i++) {
int j = list.size();
if (j > 0) {
Iterator<Integer> iter = list.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
}
}
System.out.println(System.currentTimeMillis() - start); //==================180 时间缩短了64%
}
2 使用for循环遍历集合时,此时遍历前检查集合大小可以缩短执行时间约为:5%
public static void main(String[] args) {
int N = 1000 * 10000;
List<Integer> list = new ArrayList<Integer>();
long start = System.currentTimeMillis();
for (int i = 0; i < N; i++) {
int j = list.size();
for (int t = 0; t < j; t++) {
System.out.println(list.get(t));
}
}
System.out.println(System.currentTimeMillis() - start); //==================190
start = System.currentTimeMillis();
for (int i = 0; i < N; i++) {
int j = list.size();
if (j > 0) {
for (int t = 0; t < j; t++) {
System.out.println(list.get(t));
}
}
}
System.out.println(System.currentTimeMillis() - start); //==================180 时间缩短了5%
}
2 comments:
这是为啥?
看一下ArrayList的源码:
public Iterator iterator() {
return new Itr();
}
所以不检查大小就会白白创建
1000 * 100000个Itr()对象
你可以单测一下看只创建这么多对象需要多少时间。
我估计时间主要是消耗在这了
Post a Comment