静态块与静态方法 - 初始化静态字段

nul*_*ent 8 java static-methods static-members performance-testing

出于好奇,我测量了静态块和静态方法初始化器之间的性能.首先,我在两个独立的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);    
    }
}
Run Code Online (Sandbox Code Playgroud)

第二:

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);    
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我执行了这个小批处理脚本来测量它100次并将值放在一个文件中.batchFile.bat First Second dum.res.txt

之后,我编写了这段代码来计算Dummy和Muddy测量值的平均值和标准差.

这是我得到的结果:

First size: 100 Second size: 100
First       Sum: 132    Std. deviation: 13
Second      Sum: 112    Std. deviation: 9
Run Code Online (Sandbox Code Playgroud)

它在我的其他机器上也是类似的...每次我测试它.

现在我想知道,为什么会这样?我检查了字节码,Second.class在调用System.currentTimeMillis()之间有一条指令(调用静态initList()).他们都做同样的事情,但为什么第一个慢?我只能通过查看字节码来解释它,因为这是我第一次接触javap ; 我还不懂字节码.

ale*_*oot 2

我认为静态块版本比静态方法版本慢的原因可能是由于它们获得的不同的 JIT 优化......

请参阅这篇有趣的文章以获取更多有趣的信息:Java Secret:静态块是否被解释?