Static block vs static method - inicializando campos estáticos
Por curiosidade, medi o desempenho entre o bloco estático e o inicializador de método estático. Primeiro, implementei os métodos mencionados acima em duas classes java separadas, da seguinte forma:
Primeiro
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);
}
}
Segundo
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);
}
}
Em seguida, executeiest script em lote para medir 100 vezes e colocar os valores em um arquivo.batchFile.bat First Second dum.res.txt
Depois disso, eu escreviestódigo para calcular o valor médio e o desvio padrão dos valores medidos de Dummy e Mudd
Este é o resultado que obtive:
First size: 100 Second size: 100
First Sum: 132 Std. deviation: 13
Second Sum: 112 Std. deviation: 9
E é semelhante nas minhas outras máquinas ... toda vez que eu test
Agora estou me perguntando, por que é assim? Eu verifiquei o bytecode e Second.class tem mais uma instrução (chamada para initList estático) entre chamadas para System.currentTimeMillis (). Ambos fazem a mesma coisa, mas por que o primeiro é mais lento? Eu realmente não posso pensar nisso apenas olhando o código de código, já que esta foi minha primeira vez tocando em javap; Ainda não entendo o bytecode.