8

好奇心から、静的ブロックと静的メソッド初期化子の間のパフォーマンスを測定しました。まず、上記のメソッドを次のように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に触れるのはこれが初めてだったので、バイトコードを見ただけでは本当に推論できません。私はまだバイトコードを理解していません。

4

2 に答える 2

2

静的ブロックバージョンが静的メソッドバージョンよりも遅い理由は、それらが取得するJIT最適化が異なるためである可能性があると思います...

より興味深い情報については、この興味深い記事を参照してください。Javaシークレット:静的ブロックは解釈されますか?

于 2011-11-18T22:16:31.307 に答える
2

これの理由についての私の推測は次のとおりです。

実行している初期化は、1つ以上のガベージコレクションを引き起こすのに十分なオブジェクトを作成しています。

初期化が静的ブロックから呼び出される場合、単純なメソッドの実行ではなく、クラスの初期化中に行われます。クラスの初期化中、ヒープの内容がほぼ同じであっても、ガベージ検出器は単純なメソッド実行中よりも(たとえば、実行スタックが長いために)やらなければならない作業が少し多くなる場合があります。

これをテストするには、Javaコマンドに-Xms200mなどを追加してみてください。これにより、実行している初期化中にガベージコレクションを行う必要がなくなります。

于 2011-11-18T22:21:25.293 に答える