Я пришел сюда, чтобы лучше понять влияние на производительность использования списков над массивами. Мне пришлось адаптировать код здесь для моего сценария: массив / список ~ 1000 int, используя в основном геттеры, что означает массив [j] против list.get (j)
Принимая лучшее из 7, чтобы быть ненаучным об этом (первые несколько со списком, где в 2,5 раза медленнее) я получаю это:
array Integer[] best 643ms iterator
ArrayList<Integer> best 1014ms iterator
array Integer[] best 635ms getter
ArrayList<Integer> best 891ms getter (strange though)
- так, примерно на 30% быстрее с массивом
Вторая причина публикации сейчас заключается в том, что никто не упоминает о воздействии, если вы выполняете математический / матричный / симуляционный / оптимизационный код с вложенными циклами.
Допустим, у вас есть три вложенных уровня, а внутренний цикл в два раза медленнее, чем при 8-кратном снижении производительности. То, что будет работать через день, теперь занимает неделю.
* EDIT
Весьма шокирован, я пытался объявить int [1000] вместо Integer [1000]
array int[] best 299ms iterator
array int[] best 296ms getter
Использование Integer [] и int [] представляет двойной удар по производительности, ListArray с итератором в 3 раза медленнее, чем int []. Реально думаемые реализации списков Java были похожи на собственные массивы ...
Код для справки (звоните несколько раз):
public static void testArray()
{
final long MAX_ITERATIONS = 1000000;
final int MAX_LENGTH = 1000;
Random r = new Random();
//Integer[] array = new Integer[MAX_LENGTH];
int[] array = new int[MAX_LENGTH];
List<Integer> list = new ArrayList<Integer>()
{{
for (int i = 0; i < MAX_LENGTH; ++i)
{
int val = r.nextInt();
add(val);
array[i] = val;
}
}};
long start = System.currentTimeMillis();
int test_sum = 0;
for (int i = 0; i < MAX_ITERATIONS; ++i)
{
// for (int e : array)
// for (int e : list)
for (int j = 0; j < MAX_LENGTH; ++j)
{
int e = array[j];
// int e = list.get(j);
test_sum += e;
}
}
long stop = System.currentTimeMillis();
long ms = (stop - start);
System.out.println("Time: " + ms);
}