yichao firstname, zeaster nickname, zhang lastname

性能准则之一:在遍历集合前一定要判断集合是否为空

例举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:

杨肖 said...

这是为啥?

Yichao said...

看一下ArrayList的源码:
public Iterator iterator() {
return new Itr();
}
所以不检查大小就会白白创建
1000 * 100000个Itr()对象
你可以单测一下看只创建这么多对象需要多少时间。
我估计时间主要是消耗在这了