Что быстрее? double [] [] matrix or ArrayList <ArrayList <Double>> - PullRequest
1 голос
/ 14 октября 2011

В Java, которая работает быстрее, обратите внимание, что мне не нужна гибкость (удаление, добавление) в Big O.Но мне, безусловно, нужен Access Big O.

Операция состоит только в умножении 2 матриц или вычитании, сложении и т. Д.

Ответы [ 7 ]

6 голосов
/ 14 октября 2011

double[][] намного более эффективно использует память, чем использование ArrayLists и Double.Он будет использовать часть памяти, что означает, что вы получите лучшее поведение при кэшировании.Кроме того, double в double[] будет непрерывным в памяти, что также улучшит производительность кэша.

Кстати: Double может быть довольно случайным образом размещено в памяти и там для кэша.

6 голосов
/ 14 октября 2011

С double [][] вам не нужно беспокоиться об автобоксах или внутренних операциях изменения размера / копирования, поэтому это будет быстрее.

С другой стороны, разница в производительности должна быть незаметной, если вы не работаете с очень большими коллекциями.

6 голосов
/ 14 октября 2011

double[][] будет быстрее, потому что он позволит избежать автобокс во время арифметических операций.

1 голос
/ 14 октября 2011

Операции на double[][] и ArrayList<ArrayList<Double>> будут выполняться с одинаковыми Границами Big-O .

То есть бессимптомными границамиодинаковы - если ArrayList не должен изменять размер , тогда доступ действительно равен O(1) для операций с индексами (даже если C [константа] может быть больше для доступа и двойной / двойной бокс и память-локальность).Выбор одного из других не увеличит или не уменьшит сложность и не изменит Big-O.

Какой из них настенные часы быстрее?Мои ставки на массив, но единственный способ «узнать наверняка», включая «насколько быстрее» и в каких случаях, - это сравнить различные структуры в данной среде / проблеме / размере проблемыи сравните результаты .(Это должен быть один из первых шагов при попытке «оптимизировать».)

Удачное кодирование.

1 голос
/ 14 октября 2011

double [] [] быстрее. В Java нет более примитивного утверждения, чем это.

0 голосов
/ 14 октября 2011

Массив [][] будет быстрее. ArrayList Доступ по сути такой же быстрый (он использует [] для внутреннего использования), но необходимая дополнительная работа с объектами (например, для просмотра двух объектов, а не одного массива) может сделать его немного медленнее.

0 голосов
/ 14 октября 2011

Массив должен быть быстрее, так как ArrayLust использует также внутренний массив, и поэтому у вас есть дополнительный вызов (get (x) .get (y)), который будет занимать дополнительное время.

...