kuniku’s diary

はてなダイアリーから移行(旧 d.hatena.ne.jp/kuniku/)、表示がおかしな箇所はコメントをお願いします。記載されている内容は日付およびバージョンに注意してください。直近1年以上前は古い情報の可能性が高くなります。

javaのループは高速

javaのループが超高速なのは、知っていたけども
従来のJDK1.4で記述してた(型に安全じゃないList)Listのループが
微々たる違いだけど速いんだね。ArrayListだからなのか?

ただ、100万回くらいのループじゃ違いが出ない。

Genericsを使う方が型に安全だし、コンパイラが怒ってくれるからありがたい。


JAVA:jre1.5.0_10
Eclipse3.4で実行

public class LoopTest {

    public static void main(String[] args) {

        List<String> list1 = new ArrayList<String>();

        for (int i = 0; i < 3000000; i++) {
            list1.add("");
        }

        long start1 = System.currentTimeMillis();
        for (String str : list1) {
            String s = str;
        }

        long end1 = System.currentTimeMillis() - start1;
        System.out.println("end1=" + end1);

        List list2 = new ArrayList();
        for (int i = 0; i < 3000000; i++) {
            list2.add("");
        }

        long start2 = System.currentTimeMillis();
        for (Iterator resultIt = list2.iterator(); resultIt.hasNext();) {
            String s = (String) resultIt.next();
        }
        long end2 = System.currentTimeMillis() - start2;
        System.out.println("end2=" + end2);

        long start3 = System.currentTimeMillis();
        for (int i = 0; i < list2.size(); i++) {
            String s = (String) list2.get(i);
        }
        long end3 = System.currentTimeMillis() - start3;
        System.out.println("end3=" + end3);

    }
}

実行結果
ソースの順番なども入れ替えたりしてみた結果は、以下の通り。

end1=125
end2=140
end3=79

end1=125
end2=125
end3=78

end1=125
end2=125
end3=62

end3=78
end2=125
end1=125

end2=125
end3=78
end1=140