好奇心から、静的ブロックと静的メソッド初期化子の間のパフォーマンスを測定しました。まず、上記のメソッドを次のように2つの別々のJavaクラスに実装しました。
初め:
class Dummy {
static java.util.List<Integer> lista = new java.util.ArrayList<Integer>();
static {
for(int i=0; i < 1000000; ++i) {
lista.add(new Integer(i));
}
}
}
public class First {
public static void main(String[] args) {
long st = System.currentTimeMillis();
Dummy d = new Dummy();
long end = System.currentTimeMillis() - st;
System.out.println(end);
}
}
2番:
class Muddy {
static java.util.List<Integer> lista = new java.util.ArrayList<Integer>();
public static void initList() {
for(int i=0; i < 1000000; ++i) {
lista.add(new Integer(i));
}
}
}
public class Second {
public static void main(String[] args) {
long st = System.currentTimeMillis();
Muddy.initList();
Muddy m = new Muddy();
long end = System.currentTimeMillis() - st;
System.out.println(end);
}
}
次に、この小さなバッチスクリプトを実行して、100回測定し、値をファイルに入れました。batchFile.bat First Second dum.res.txt
その後、ダミーとマディの測定値の平均値と標準偏差を計算するために、このコードを作成しました。
これは私が得た結果です:
First size: 100 Second size: 100
First Sum: 132 Std. deviation: 13
Second Sum: 112 Std. deviation: 9
そして、それは私の他のマシンでも同様です...私がそれをテストするたびに。
今、私は疑問に思っています、なぜそうなのですか?バイトコードを確認したところ、System.currentTimeMillis()の呼び出しの間にSecond.classにもう1つの命令(static initList()の呼び出し)があります。どちらも同じことをしますが、なぜ最初のものが遅いのですか?javapに触れるのはこれが初めてだったので、バイトコードを見ただけでは本当に推論できません。私はまだバイトコードを理解していません。