Из любопытства я измерил производительность между статическим блоком и инициализатором статического метода. Сначала я реализовал вышеупомянутые методы в двух отдельных java-классах, например:
Первый:
class Dummy {
static java.util.List lista = new java.util.ArrayList();
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 lista = new java.util.ArrayList();
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 Первая секунда 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 есть еще одна инструкция (вызов static initList ()) между вызовами System.currentTimeMillis (). Они оба делают одно и то же, но почему Первый медленнее? Я не могу понять это, просто взглянув на байт-код, поскольку это был мой первый раз, когда я касался javap ; Я пока не понимаю байт-код.