Когда я использовал C++ в колледже, мне было предложено использовать многомерные массивы (здесь MDA), когда это возможно, поскольку оно обладает лучшей локальностью памяти, поскольку оно выделено в одном большом фрагменте. С другой стороны, массив массивов (AoA) распределяется в несколько меньших фрагментов, возможно, разбросанных по всему месту в физической памяти везде, где найдутся вакансии.Сравнение производительности массива массивов против многомерных массивов
Таким образом, я догадываюсь, что первый вопрос: это миф или это совет, заслуживающий внимания?
Предполагая, что это последнее, тогда следующий вопрос будет состоять в том, что делать на языке Java, который не имеет истинного MDA. Конечно, не так уж сложно подражать MDA с 1DA. По сути, то, что является синтаксическим сахаром для языков с MDA, может быть реализовано как поддержка библиотеки для языков без MDA.
Это стоит усилий? Это слишком низкий уровень проблемы оптимизации для языка, такого как Java? Должны ли мы просто отказаться от массивов и использовать List
s даже для примитивов?
Другой вопрос: в Java, делает выделение AoA сразу (new int[M][N]
), возможно, дают различное распределение памяти, чем делать это иерархически (new int[M][]; for (... new int[N]
)?
См. Также http://stackoverflow.com/questions/2512082/java-multi-dimensional-array-vs-one-dimensional, который содержит фактические результаты тестов. – rwong