@kunjut19

Массив объектов или массив «массивов»?

Если представить, что я пишу игру с клеточной картой (что-то типа Цивилизации или Героев), какой способ хранения информации о клетках был бы предпочтительней с точки зрения быстродействия?
Клеток много (допустим, 100.000), и в каждой клетке хранится куча информации - какому игроку принадлежит клетка, тип ландшафта, ресурсы, занята ли юнитом, сведения о соседних клетках (если рядом морская клетка - то можно строить порт). Игрок захватывает замок, и теперь нужно пробежаться по большому количеству клеток вокруг замка и поменять в них принадлежность тому или иному игроку.
Это только модель, чтобы было легче понять, что именно я имею ввиду. С точки зрения такой модели, с чем быстрее происходит работа - с двумерным массивом объектов или с трехмерным массивом строк и чисел? Если пренебречь тем, что удобнее будет понять запись map[463][537].type='grass', чем map[463][537][31]='grass', то что будет лучшим выбором?
Не знаю, будет ли разница в зависимости от языка, поэтому не ориентирую вопрос на конкретный язык.
  • Вопрос задан
  • 179 просмотров
Пригласить эксперта
Ответы на вопрос 3
Произвел сейчас простейший замер. Разница не велика +-15%.
Выигрывает двумерный массив объектов.
(производил замер на java)
Ответ написан
код c#:
using System;
using System.Diagnostics;

namespace ConsoleApp19 {
	class Program {
		struct Cell {
			public string type;
			public string player;
			public bool isUnit;
		}

		public static void Main() {
			const int size = 1_000;

			object[,,] objs = new object[size, size, 3];
			Cell[,] cells = new Cell[size, size];

			Stopwatch timer = new Stopwatch();
			timer.Start();
			for (int i = 0; i < size; i++) {
				for (int j = 0; j < size; j++) {
					objs[i, j, 0] = "type";
					objs[i, j, 1] = "player";
					objs[i, j, 2] = false;

					string type = (string)objs[i, j, 0];
					string player = (string)objs[i, j, 1];
					bool isUnit = (bool)objs[i, j, 2];
				}
			}
			timer.Stop();
			Console.WriteLine(timer.ElapsedMilliseconds);

			timer.Reset();
			timer.Start();
			for (int i = 0; i < size; i++) {
				for (int j = 0; j < size; j++) {
					cells[i, j].type = "type";
					cells[i, j].player = "player";
					cells[i, j].isUnit = false;

					string type = cells[i, j].type;
					string player = cells[i, j].player;
					bool isUnit = cells[i, j].isUnit;
				}
			}
			timer.Stop();
			Console.WriteLine(timer.ElapsedMilliseconds);
		}
	}
}


Вывод:
89 (3-ёх мерный массив)
18 (2-ух мерный)
Ответ написан
Griboks
@Griboks
Кто-то на хабре исследовал этот вопрос. Можете поискать. Краткая суть: массив массивов работает быстрее, т.к. я является простейшей указательной арифметикой, когда объекты требуют ссылок, контроля памяти, выравнивания и иже с ними.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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