Сравнение производительности массива массивов по сравнению с многомерными массивами

Когда я использовал C++ в колледже, мне сказали использовать многомерные массивы (настоящим MDA), когда это возможно, так как он показывает лучшую местность памяти, так как он выделяется в одном большом блоке. Массив массивов (AoA), с другой стороны, выделяется в нескольких меньших блоках, возможно рассеянных повсеместно в физической памяти везде, где вакансии найдены.

Таким образом, я предполагаю, что первый вопрос: действительно ли это - миф, или действительно ли это - совет, стоящий следующего?

Предположение, что это - последний, затем следующий вопрос, состояло бы в том, что сделать на языке как Java, который не имеет истинного MDA. Дело не в этом трудно для эмуляции MDA с 1 дальтоном, конечно. По существу, что является синтаксическим сахаром для языков с MDA, может быть реализован как поддержка библиотеки языков без MDA.

Действительно ли это стоит усилия? Этот слишком низкий уровень проблемы оптимизации для языка как Java? Если мы просто отказываемся от массивов и использования Lists даже для примитивов?


Другой вопрос: в Java, делает выделение AoA сразу (new int[M][N]) возможно приведите к другому выделению памяти, чем выполнение его иерархически (new int[M][]; for (... new int[N])?

7
задан polygenelubricants 5 March 2010 в 06:59
поделиться

3 ответа

Java и C # выделяют память совершенно иначе, чем C ++. Фактически, в .NET наверняка все массивы AoA будут близко друг к другу, если они будут выделены один за другим, потому что в памяти есть только один непрерывный фрагмент без какой-либо фрагментации.

Но это все еще верно для C ++ и все еще имеет смысл, если вам нужна максимальная скорость. Хотя вам не следует следовать этому совету каждый раз, когда вам нужен многомерный массив, вы должны сначала написать поддерживаемый код, а затем профилировать его, если он медленный, преждевременная оптимизация является корнем всего зла в этом мире.

3
ответ дан 7 December 2019 в 14:31
поделиться

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

Вообще говоря, это не стоит усилий. Лучшая стратегия, чтобы забыть об этой проблеме в первой версии вашего приложения и реализовать ее простым (то есть простым в обслуживании) способом. Если первая версия работает слишком медленно для ваших требований, используйте инструмент профилирования, чтобы найти узкие места приложения. Если профилирование предполагает, что массивы массивов могут быть проблемой, проведите несколько экспериментов, чтобы изменить структуры данных на моделируемые многомерные массивы и профилировать, чтобы увидеть, имеет ли это существенное значение. [Я подозреваю, что это не будет иметь большого значения. Но самое главное - не тратить время на оптимизацию чего-либо без надобности.]

Должны ли мы просто отказаться от массивов и использовать списки даже для примитивов?

Я бы не стал заходить так далеко. Предполагая, что вы имеете дело с массивами заранее определенного размера:

  • массивы объектов будут немного быстрее, чем эквивалентные списки объектов, а
  • массивы примитивов будут значительно быстрее и будут занимать значительно меньше места, чем эквивалентные списки примитивов. обертка.

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

1
ответ дан 7 December 2019 в 14:31
поделиться

Я бы не стал тратить силы на использование одномерного массива в качестве многомерного массива в Java, потому что здесь нет синтаксиса, который мог бы помочь. Конечно, можно определить функции (методы), чтобы скрыть работу за вас, но вы просто получаете вызов функции вместо того, чтобы следовать за указателем при использовании массива массивов. Даже если компилятор / интерпретатор ускорит это для вас, я все равно не думаю, что это того стоит. Кроме того, вы можете столкнуться с проблемами при попытке использовать код, который ожидает массивы 2D (или N-Dim), которые ожидаются как массивы массивов. Я уверен, что наиболее общий код будет написан для таких массивов на Java. Также можно дешево переназначить строки (или столбцы, если вы решите так думать).

Если вы знаете, что этот массив multidim является узким местом, вы можете проигнорировать то, что я сказал, и посмотреть, поможет ли ручная оптимизация.

0
ответ дан 7 December 2019 в 14:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: