Хеш-таблица против обуза глобальных массивных переменных
В общем, мне бы хотелось узнать все плюсы и все минус хеш-таблицы в сравнении с обузом массивных переменных.
Пока из минусов могу сказать то, что получается больше строк кода практически в 1.5 раз, а в системах с 0.01 таймерами это лишняя нагрузочка и минус фпс.




Просмотров: 1 802

» Лучшие комментарии


DracoL1ch #1 - 3 года назад 3
в системах с 0.01 таймерами главный минус хештаблиц и глобалок - это системы с 0.01 таймерами.
такая частота не нужна в 99% случаев, а с оставшимся 1% наверняка работают те, кто такими вопросами не задается
хеш удобнее, потому что можно ложить данных по ключу = хендлу объекта, что гарантирует его созхранность. массив удобнее ТОЛЬКО потому, что слегка быстрее. если у тебя просадки фпс суровые - можешь попробовать массивы. если нет - используй хеш и будь счастлив.
ну а если ты работаешь в редакторе, есть какие-то структуры в псевдоязыке vjass, которые имитируют ту же хештаблицу на обычных массивах
Steal nerves #2 - 3 года назад (отредактировано ) 0
У обычных массивов от переменной, то там индекс не такой большой (от -8192 до 8192). Нельзя туда ни хэндлы всунуть, ни равкоды. Равкод к счастью можно заменить на тип переменную как тип юнита. А в хэш-таблицу все влезает, и норм. Обычные массивы неудобны еще тем, что там нельзя аттачить, приходится делать более сложные конструкции с пробегом цикла и проверками, чтобы найти нужный индекс. А вот в хэше можно сразу лепить аттач (по хэндлу юнита).
Различны способы хранения - (удобно когда массивов больше - удобно сделать сложную конструкцию). В более простых конструкциях этого не нужно.
xgm.guru/p/100/183113 массивы хэша
xgm.guru/p/100/183650 пробовал реализовать с помощью неких констант, когда не хватало ячеек
DracoL1ch #3 - 3 года назад 0
Steal nerves:
У обычных массивов от переменной, то там индекс не такой большой (от -8192 до 8192).
вообще-то отрицательных индексов у массивов нет, 0..8191
quq_CCCP #4 - 3 года назад 1
Steal nerves:
У обычных массивов от переменной, то там индекс не такой большой (от -8192 до 8192). Нельзя туда ни хэндлы всунуть, ни равкоды. Равкод к счастью можно заменить на тип переменную как тип юнита. А в хэш-таблицу все влезает, и норм. Обычные массивы неудобны еще тем, что там нельзя аттачить, приходится делать более сложные конструкции с пробегом цикла и проверками, чтобы найти нужный индекс. А вот в хэше можно сразу лепить аттач (по хэндлу юнита).
Различны способы хранения - (удобно когда массивов больше - удобно сделать сложную конструкцию). В более простых конструкциях этого не нужно.
xgm.guru/p/100/183113 массивы хэша
xgm.guru/p/100/183650 пробовал реализовать с помощью неких констант, когда не хватало ячеек
А и ненужно в массивы засовывать хендлы, структуры vjass'a чуть чуть побыстрее, ну и малость удобнее в написании, писанины чуть меньше, если ты работаешь с тучей данных а не 3-5 переменных типа кастер, урон, расстояние...
Есть системы без хештаблицы, но они не такие уж универсальные, и нужны реально в редких случаях, но можно юзать для тех же спеллов, пример такой системы Xattach (гугл в помощь), там целлая группа массивов.
Diaboliko #5 - 3 года назад 0
массив удобнее ТОЛЬКО потому, что слегка быстрее
При использовании БД на массивах прозрачны действия движка(как реализован интерфейс работы с хт - одним близзам известно). Сразу ясно какой из вариантов реализации эффективнее
DracoL1ch #6 - 3 года назад 0
Diaboliko:
массив удобнее ТОЛЬКО потому, что слегка быстрее
При использовании БД на массивах прозрачны действия движка(как реализован интерфейс работы с хт - одним близзам известно). Сразу ясно какой из вариантов реализации эффективнее
?? обычное дерево. что конкретно тебя смущает-то? неважно, что под капотом, если оно работает без ошибок
quq_CCCP #7 - 3 года назад 0
DracoL1ch, Просто бытует мнение что у хт не пофикшена коллизия, но так доказательств этому нету....
Clamp #8 - 3 года назад 0
Да там StringHash( ) жрёт больше, чем все перезаписывания в массивах вместе взятые (кстати, на память не влияет значение переменной, влияет только факт её проинициализированности). Короче, юзайте структуры (и читайте русский мануал по ним), это удобнее хранения данных в хэше или массиве, и по факту является работой с массивами напрямую. И быстро, и удобно.
Extremator #9 - 3 года назад (отредактировано ) 0
Clamp, что есть "проинициализированность переменной" ? х)
Clamp, чем отличаются структуры (которые есть только на момент их написания, но их попросту не существует в скрипте) от массивов (которые просто есть и точка)?
quq_CCCP #10 - 3 года назад 0
Extremator:
Clamp, что есть "проинициализированность переменной" ? х)
Clamp, чем отличаются структуры (которые есть только на момент их написания, но их попросту не существует в скрипте) от массивов (которые просто есть и точка)?
Интерфейсом и системой слежения за тем занята или свободна та или иная ячейка + защита от переполнения массива, не хотите vjass пишите все сами...
Extremator #11 - 3 года назад 0
Не хотите всё сами - пишите на vJass / GUI.
действительно
Clamp #12 - 3 года назад 0
чем отличаются структуры от массивов?
Внимание, ответ:
структуры
есть только на момент их написания
массивы
просто есть и точка
что есть "проинициализированность переменной" ?
Что в памяти выделено место, где она хранится, и ничто иное это место занять не может. По-хорошему, в компиляторе должен быть сборщик мусора, который освобождает память, на которую не остаётся ни одной живой ссылки, но в варкрафте слишком много типов, которые являются ссылочными и, следовательно, всегда держат ссылку на память, не давая сборщику мусора её освобождать. Вот пока переменная висит неочищенным ссылочным типом, она является проинициализированной.

чем отличаются структуры от массивов?
Тем, что препроцессор vJass сам генерирует Jass код таким образом, что лишних масссивов попросту не создаётся (за инициализированность элементов массивов ссылочных типов, однако, всё равно отвечает автор vJass кода). Кстати, если мне не изменяет память, каждый созданный массив де-факто имеет 8190 элементов, если проинициализирован хотя бы один из них: в них не лежат ссылки, но место зарезервировано.
Extremator #13 - 3 года назад 0
Clamp:
Внимание, ответ
ты пишешь что это удобнее... вопрос - чем? подталкивая к ответу на вопрос тс
а в скобках я лишь обозначил их природу
ты же мне отвечаешь - "их природа бла-бла-бла...", что не является ответом
а вопрос тс в том что плюс, а что минус при абузе
Дальше
Ты говоришь что не имеет значения что записано в переменной
И теперь следом говоришь что она держит ссылку, который == корень зла
Добавляя что наличие чего-либо в переменной (ссылки) является ответом на то, "проинициализированна" ли она, или нет...
. . . что в переменной (ссылка) - не важно
. . . важно - проинициализированная ли она
. . . проинициалзация переменной == ссылке в переменной
WTF?
Clamp:
каждый созданный массив де-факто имеет 8190 элементов
а почему не 8191? или не 8192?
quq_CCCP #14 - 3 года назад 0
Clamp, Extremator, что то вы совсем уехали от темы, надо не разбирать что как устроено а что лучше в тех или иных случаях и почему...
Clamp #15 - 3 года назад (отредактировано ) 0
защита от переполнения массива
Всё легко переполняется, если поставить целью переполнять.
» вот так, например.
struct New
{
	int a
	
	static New create(int _Input) {
		New this = New.allocate()
		this.a = _Input
		return this
	}
}

void SomeFunc ()
{
	int i = 0
	while ( i++ < 9001 ) {
		New.create(0)
	}
	TriggerSleepAction(99999) // How long we need to keep overflow.
}

WTF?
Господи, ты вообще про разницу между нативными и ссылочными типами не слышал? Не читал ни одной статьи по оптимизации? Нативные типы плоди и инициализируй как и сколько хочешь, их подчищает ядро системы, а ссылочные типы для системы - чёрный ящик, она их не трогает, и их надо чистить самому.
И поскольку мы говорим в отношении варкрафта, а не системы, а в варкрафте помимо нескольких нативных есть ещё и куча ссылочных типов, то для тебя по факту имеет значение статус инициализированности переменных только этих ссылочных типов.
а почему не 8191? или не 8192?
Потому что я так запомнил.
Extremator #16 - 3 года назад 0
quq_CCCP, так в том-то и дело, что вопрошающий человек и не понимающий о том что Clamp пишет будет думать так - "блин, я этого не понимаю, это слишком заумно для меня, для меня это в данный момент пустой звук, это мне не поможет", и в итоге он уходит от сюда ни с чем.
А ведь тематика здесь как раз такая, что незнающий человек может спросить и получить вопрошаемое знание. Разве нет?
А понимающий человек - попросту не будет задавать такой вопрос, и следовательно не получит такой ни-о-чём-размытый ответ... Но если у этого же человека будет другой вопрос - ему вот такие дадут другой точно такой же ответ, при этом нагородив тонны важного текста... ага, да
quq_CCCP #17 - 3 года назад 0
Clamp, Там пишет что массив переполнен, вместо фатала.
Clamp #18 - 3 года назад 0
Там пишет что массив переполнен, вместо фатала.
Да, но массив-то переполнен, эффект достигнут =)
quq_CCCP #19 - 3 года назад 0
Clamp, под защитой я подразумевал что не даст игре вылететь от фатала, выдав дебаг сообщения и начиная записи по кругу, давая понять где ошибка.