直接newとClass#newInstance()の速度差

あまり気にしちゃいけないところかもしれないけど、調べてみた。使ったJVMは 6u14。

一回だけ呼出

newInstance() は new より桁違いに遅い。ただし、μ秒の世界。

public class Instance {
    public static void main(String[] args) throws Exception {
        long start0 = System.nanoTime();
        String.class.newInstance();
        long time0 = System.nanoTime() - start0;
        System.out.println("newInstance() : " + time0);

        long start1 = System.nanoTime();
        new String();
        long time1 = System.nanoTime() - start1;
        System.out.println("new           : " + time1);

    }
}
$ java Instance
newInstance() : 138216
new           : 3003

$ java Instance
newInstance() : 107905
new           : 5238

$ java Instance
newInstance() : 110000
new           : 4191
いったん実行してキャッシュを生成してから計測

Class#newInstance()のコードを見ると、その過程でキャッシュを生成するようなので、一度実行させてから2度目を計測。条件をそろえるため直接new側も事前に1回呼び出し。それでもClass#newInstanceは直接newの4倍くらい遅い。ただし、μ秒の世界。

public class Instance {
    public static void main(String[] args) throws Exception {
        String.class.newInstance();
        long start0 = System.nanoTime();
        String.class.newInstance();
        long time0 = System.nanoTime() - start0;
        System.out.println("newInstance() : " + time0);

        new String();
        long start1 = System.nanoTime();
        new String();
        long time1 = System.nanoTime() - start1;
        System.out.println("new           : " + time1);

    }
}
$ java Instance
newInstance() : 5727
new           : 1537

$ java Instance
newInstance() : 5867
new           : 1467

$ java Instance
newInstance() : 5657
new           : 1536