出于好奇,我测量了静态块和静态方法初始值设定项之间的性能。首先,我在两个单独的 java 类中实现了上述方法,如下所示:
First:
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);
}
}
Second:
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);
}
}
然后我执行了this http://codepad.org/7plqLRVD小批处理脚本来测量 100 次并将值放入文件中。batchFile.bat First Second dum.res.txt
之后我写了this http://codepad.org/YmME2Df4用于计算 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())。
他们都做同样的事情,但为什么第一个慢呢?仅通过查看字节码我无法真正推理出来,因为这是我第一次接触javap;我还不懂字节码。