Java のオブジェクト生成にかかる時間
つまらない覚書。
public class intcreate { public static void main(String[] args) { final int loop = Integer.MAX_VALUE; long start = System.currentTimeMillis(); for (Integer i = 0; i < loop; i++) {} // boxing の呪い System.out.printf("Integer...%d ms elapsed %n", System.currentTimeMillis() - start); start = System.currentTimeMillis(); for (int i = 0; i < loop; i++) {} System.out.printf("int...%d ms elapsed %n", System.currentTimeMillis() - start); start = System.currentTimeMillis(); System.out.printf("...%d ms elapsed %n", System.currentTimeMillis() - start); } }
Integer...14371 ms elapsed int...3 ms elapsed ...0 ms elapsed
単純な Integer オブジェクトの生成で、21億オブジェクトの生成が 14秒。毎秒1.5億個くらい?15nsec(ナノセコンド)に一個?CPU のクロックが 2.5GHz くらいだっけこのマシン・・・。20クロック程度でオブジェクト一個生成?
オブジェクト生成を忌避するより、それが可読性の向上につながるんであればためらわず使う方が良さそうだ。
もちろん上記の例みたいに、「無駄に」21億回オブジェクト生成が走るようなのはそれを避ける方法で書いた方がいいだろうけど。(下の例は実際に21億回のインクリメントを3msで終わらしたわけではなく、何らかの最適化が働いたんだと思われる・・・プリミティブ型であればそういう最適化が働きやすいヨと。)
追記:
Javaコストメモ(Hishidama's Java cost Memo)
こちらのが断然詳しい。