Учитывая одинаковое количество слоев массива/объекта, каждый индекс указывает на одни и те же вещи, каков наилучший порядок вложения массивов и объектов?
Я делаю игру на основе сетки, и мне нужно хранить несколько фрагментов информации о каждом квадрате. Я знаю, что невозможно обойти несколько уровней массивов/объектов. У меня это уже работает одним способом, поэтому, прежде чем я начну изменять огромное количество кода (у меня есть как минимум 5 функций с тяжелым оператором switch внутри каждой (чтобы выбрать слой, с которым мы работаем), и может быть, 10 других, которые мне также придется изменить вместе с функцией инициализации), я хотел бы знать, действительно ли это изменение соответствует лучшим практикам.
В настоящее время у меня это выглядит так: Game.grid.map[x][y][layer][direction]
, поэтому карта с обычным 2D-массивом, и каждый элемент является объектом, содержащим свойства "V", "S", "M" и "G" , каждый из которых содержит массив. (металл, кремний, ворота и переходные отверстия)
Я подумывал о переходе на Game.grid.map[layer][x][y][direction]
. Мне пришлось бы немного изменить структуру (например, где у меня есть var base = this.map[x][y];
, а затем использовать base[layer][dir]
. Но я мог бы легко внести это изменение и использовать переменные baseM, baseG и baseS. Просто утомительно менять Я хотел бы знать, будет ли более эффективно иметь 1 объект с 5 большими массивами, чем иметь большой 2D-массив со многими очень маленькими объектами.
Я где-то читал, что в чистых массивах это зависит от того, как часто индекс меняется на каждом уровне, а внешние уровни меняются медленнее. По этому есть смысл его менять. Я склонен иметь дело с металлом сразу, переходными отверстиями сразу, кремнием и гейтами вместе.
Поиск в Google привел меня к следующему QA: Самый быстрый способ чтения /хранить много многомерных данных? (Java), но это касается только чистых массивов, а не смеси объектов и массивов.
===Изменить===
1) Так что да, я пропустил, что QA, который я нашел, был java вместо javaScript.
2) Я немного изменил их тест.
var arr = [];
for (int x=0; x<100; x++){
arr[x] = [];
for (int y=0; y<100; y++){
arr[x][y] = [];
for (int z=0; z<100; z++){
arr[x][y][z] = 1;
}
}
}
Это заняло около 10 мс. (измерено путем вставки функции в консоль и вычитания этой метки времени из «неопределенной» метки времени.) Между созданием верхнего уровня как объекта и созданием нижнего уровня как группы объектов также было 10 мс. Создание всех объектов уровней заняло 9 мс. Это меня удивило. Но это также означает, что Берги был прав. Это не имеет значения. Меня беспокоило огромное количество существующих объектов, но если 10 000 новых объектов занимают менее 10 мс, моя сетка из 400 объектов никогда не должна быть проблемой.
Так что на самом деле единственное изменение в эффективности, которое можно найти, заключается в том, сколько времени вам потребуется для чтения/записи кода, помеченного тем или иным способом. И для меня определенно проще избежать параллельных массивов на этом. (Я не знал, что этот вопрос будет о микрооптимизации.) Спасибо всем, кто ответил.