позволяет взглянуть на следующие методы два Java:массив доступа через массив потери производительности огромный
static void performance1() {
int a=0;
int b=0;
int[] arrayA = { 3, 4, 5 };
int[] arrayB = { 4, 5, 6, 3, 4, 5, 6, 7, 8, 4 };
long start = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
for (int k = 0; k < 100; k++) {
a = arrayA[2];
b = arrayB[1];
}
}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
static void performance2() {
int a=0;
int b=0;
int[] arrayA = { 3, 4, 5 };
int[] arrayB = { 4, 5, 6, 3, 4, 5, 6, 7, 8, 4 };
long start = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
for (int k = 0; k < 100; k++) {
b = arrayB[arrayA[2]];
}
}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
Первый метод занимает 209 мс для выполнения на моей системы, seccond 4295! так что в 20 раз больше. Как это может быть? Насколько я могу видеть это я могу получить прирост производительности 20time если я объявляю 3 раздельные переменные вместо Arraya, потому что следующий метод выполняется очень быстро снова:
static void performance3() {
int a=0;
int b=0;
int[] arrayA = { 3, 4, 5 };
int[] arrayB = { 4, 5, 6, 3, 4, 5, 6, 7, 8, 4 };
long start = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
for (int k = 0; k < 100; k++) {
b = arrayB[a];
}
}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
Am я с видом что-то очевидное здесь? мне действительно кажется удивительным, что разница настолько велика. Спасибо в любом случае за разъяснениями :)
В первом методе вы всегда получаете доступ к тем же элементам, поэтому компилятор, скорее всего, оптимизирует это. Во втором методе компилятор не может оптимизировать доступ к 'arrayB', так как он не знает индекс во время компиляции (поскольку он может меняться во время выполнения). – Thomas
Вы понимаете, что 'arrayB [a]' всегда 'arrayB [0]'? –
Я просто запустил свой код на своей машине, и все методы так же длится, поэтому, возможно, это что-то еще. Какой JDK вы используете? Как вы их называете? – Thomas