出于好奇心,我测量了静态块和静态方法初始化之间的性能差异。首先,我在两个不同的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);
}
}
第二点:
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
之后,我写了这段代码来计算Dummy和Muddy的平均值和标准差。这是我得到的结果:
First size: 100 Second size: 100
First Sum: 132 Std. deviation: 13
Second Sum: 112 Std. deviation: 9
在我的其他电脑上也是一样的...每次测试都是这样。
现在我在想,为什么会这样呢?我检查了字节码,发现Second.class在System.currentTimeMillis()调用之间有一个额外指令(调用静态initList())。它们都做同样的事情,但为什么First比Second慢呢?我不能仅仅通过查看字节码就推出结论,因为这是我第一次接触javap;我还不理解字节码。
initList()
的调用,这是我从不指望的事情。 - Clockwork-MuseFirst
和Second
之间的指令;那Dummy
和Muddy
呢? - Clockwork-Muse