Я играю с некоторым фрагментом кода, вычисляя время, необходимое для вычисления некоторого кода Java, чтобы получить представление об эффективности или неэффективности некоторых функций Java. Поэтому я застрял сейчас с каким-то действительно странным эффектом, который я просто не могу объяснить. Может быть, кто-то из вас может помочь мне понять это.
public class PerformanceCheck {
public static void main(String[] args) {
List<PerformanceCheck> removeList = new LinkedList<PerformanceCheck>();
int maxTimes = 1000000000;
for (int i=0;i<10;i++) {
long time = System.currentTimeMillis();
for (int times=0;times<maxTimes;times++) {
// PERFORMANCE CHECK BLOCK START
if (removeList.size() > 0) {
testFunc(3);
}
// PERFORMANCE CHECK BLOCK END
}
long timeNow = System.currentTimeMillis();
System.out.println("time: " + (timeNow - time));
}
}
private static boolean testFunc(int test) {
return 5 > test;
}
}
Запуск этого результата в относительно длительное время вычисления (помните, что removeList пуст, поэтому testFunc даже не вызывается):
time: 2328
time: 2223
...
При замене чего-либо из комбинации removeList.size() > 0 и testFunc (3) с чем-либо еще имеет лучшие результаты. Например:
...
if (removeList.size() == 0) {
testFunc(3);
}
...
Результаты в (testFunc вызывается каждый раз):
time: 8
time: 7
time: 0
time: 0
Даже вызов обеих функций, независимых друг от друга, приводит к более низкому времени вычисления:
...
if (removeList.size() == 0);
testFunc(3);
...
Результат:
time: 6
time: 5
time: 0
time: 0
...
Только эта конкретная комбинация в моем первоначальном примере занимает так много времени. Это раздражает меня, и я бы очень хотел это понять. Что в этом особенного?
Спасибо.
Дополнение:
Изменение testFunc() в первом примере
if (removeList.size() > 0) {
testFunc(times);
}
для чего-то еще, например
private static int testFunc2(int test) {
return 5*test;
}
Результат будет быстрым снова.