newとnewInstanceのパフォーマンス

実装について同僚と話していて気になったので調べた。
http://d.hatena.ne.jp/ihiroky/20090827/1251388837
を参考にさせてもらってちょっとプラス調べたことを書き留めておく。

実行環境は自分のmac, java7
詳しいスペックとか面倒臭いのでとりあえず割愛

```java:キャッシュなし
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);
```
```
newInstance() : 117000
new           : 3000
```
```java:キャッシュあり
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);
```
```
newInstance() : 4000
new           : 1000
```
```java:キャッシュあり,if文分岐1つ目
String.class.newInstance();
long start0 = System.nanoTime();
String.class.newInstance();
long time0 = System.nanoTime() - start0;
System.out.println("newInstance() : " + time0);

String str = new String();
Class clazz = str.getClass();
long start1 = System.nanoTime();
if (clazz == String.class) {
           new String();
}
long time1 = System.nanoTime() - start1;
System.out.println("new           : " + time1);
```
```
newInstance() : 4000
new           : 1000
```

```java:キャッシュあり,if文分岐2つ目
String.class.newInstance();
long start0 = System.nanoTime();
String.class.newInstance();
long time0 = System.nanoTime() - start0;
System.out.println("newInstance() : " + time0);

String str = new String();
Class clazz = str.getClass();
long start1 = System.nanoTime();
if (clazz == Integer.class) {
           new String();
} else if (clazz == String.class) {
           new String();
}
long time1 = System.nanoTime() - start1;
System.out.println("new           : " + time1);
```
```
newInstance() : 4000
new           : 31000
```
```java:キャッシュあり,if文分岐3つ目
String.class.newInstance();
long start0 = System.nanoTime();
String.class.newInstance();
long time0 = System.nanoTime() - start0;
System.out.println("newInstance() : " + time0);

String str = new String();
Class clazz = str.getClass();
long start1 = System.nanoTime();
if (clazz == Integer.class) {
           new String();
} else if (clazz == Long.class) {
           new String();
} else if (clazz == String.class) {
           new String();
}
long time1 = System.nanoTime() - start1;
System.out.println("new           : " + time1);
```
```
newInstance() : 4000
new           : 56000
```

if文での比較にclassを使ってたりするのは今回自分が調べたい対象だったからなので
ツッコミはなしでお願いします。

## 結論
検証方法がかなり荒いので話半分ですが、
if文で制御してやるならnewInstance()でもパフォーマンスに関して問題ない感じ


## 追記
@asahina_dev さんにコメントで教えてもらった

```java:
String.class.getConstructor().newInstance();
```

についても確認してみた

```java:キャッシュなし
                 long start2 = System.nanoTime();
                 String.class.getConstructor().newInstance();
                 long time2 = System.nanoTime() - start2;
                 System.out.println("getConstructor() : " + time2);

```
```
getConstructor() : 148000
```

```java:キャッシュあり
                 String.class.getConstructor().newInstance();
                 long start2 = System.nanoTime();
                 String.class.getConstructor().newInstance();
                 long time2 = System.nanoTime() - start2;
                 System.out.println("getConstructor() : " + time2);
```
```
getConstructor() : 13000
```
getInstance()よりgetConstructor()の方が遅い理由の一つは
getConstructorの場合は継承メンバーまで含むからなのかなーと思っている