Массив объектов или объект с массивами? - PullRequest
4 голосов
/ 11 августа 2011

У меня есть выбор дизайна: создать ли массив объектов-оболочек, каждый из которых содержит несколько отдельных значений, или создать объект, содержащий несколько различных массивов значений?

Вариант 1:

Node[][] nodes;
class Node{
   double val1;
   double val2;
}

Вариант 2:

Node[] nodes;
class Node{
    double[] val1;
    double[] val2;
}

Моя интуиция говорит, что вариант 2 будет более эффективным только потому, что будет меньше объектов и, следовательно, меньше накладных расходов, но будет двойной [] 'будет так же дорого?

Ответы [ 3 ]

7 голосов
/ 11 августа 2011

Знаете ли вы, что здесь будет существенная проблема? Сколько из них вы собираетесь создать?

Не стоит слишком сильно беспокоиться о производительности - спросите себя, есть ли у одного узла логически несколько пар значений или только одна пара. Пусть ваши классы следуют тому, что вы моделируете - следите за производительностью и использованием памяти, но не позволяйте этому диктовать свой дизайн, исключая естественную модель.

1 голос
/ 14 июля 2014

Модель памяти ->

Массив = значение1, значение2, значение3 ...

Объект = Поле1, Поле2, Поле3 ...

Если у вас есть массив объектов, память выглядит так: Field1, Field2, Field3, Field1, Field2, Field3...

Если у вас есть объект с массивами, память выглядит как Field1, Field1, Field1.... Field2, Field2, Field2...

Доступ к непрерывной памяти быстрее, чем доступ к несмежной памяти.

1 голос
/ 11 августа 2011

Если у вас есть массив 10 * 20, это означает 10 * 20 * 2 в первом случае и 10 * (20 + 20) во втором случае. В обоих случаях это составляет 400. Таким образом, нет никакой разницы с точки зрения памяти.

Если ваш массив содержит только пару узлов, вы также можете рассмотреть HashMap, где K - неизменный класс, содержащий координаты массива данного узла, а V - объект, содержащий val1 и val2 для этого узла. Вы бы выделяли память только на узел, а не на весь массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...