![]()
user_jasser
![]() offline
Опыт:
232Активность: |
Ассоциативное индексирование
Предлагаю вашему вниманию еще одну наработку.
Что она из себя представляет? В общем это без малого хэш, реализованный на jass. Зачем он нужен? В первую очередь для динамического индексирования RB_объектов или ревкодов, а также, можно сохранять значение и извлекать его по 32битному ключу. Как работает? Сначало генерируется хеш-значение в таблице(63*128). Здесь береться шесть младших бит старшего слова и семь младших бит младшего. hash =((val*0x200)/0x2000000)*((val*0x1000000)/0x1000000) в результате генерируются индекс в хеш-таблице. Дальше ключ делиться на два слова и сохраняться в две хешь-структуры, индекс структуры младшего слова возвращаеться из функции. [hash] <----> [Hi] <----> [Lo] return [Lo] Коллизии решаются четырех-связным списком : ![]() Код:
Преимущества перед gamecache - создает ассоциативный индекс для переменных с массивом(gamecache этого не делает). Работает быстрее чем gamecache на 35-12% при небольшом количестве сохраненных объектов 1..1000. Недостатки это - способность работать только с integer, каждому ключу можно присвоить только одно значение. При болеше 2000 сохраненных ключей может работать медленей чем gamecache на 3% и более. Поэтому чтоб работало быстро нужно следить за наполнением таблицы и удалять ненужные ключи!. Применять достаточно просто : Код:
Отредактировано user_jasser, 27.05.2009 в 15:04. |
![]() |
#1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Ranger21
I love beatiul days XD
![]() ![]() offline
Опыт:
13,274Активность: |
Ммм... интересная штука, а применение в чём?=) |
![]() |
#2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Мирдж
![]() offline
Опыт:
7,981Активность: |
Ranger21, как замена стандартному кешу Варика:
Цитата:
user_jasser, я, конечно, не разбираюсь, как это все работает, но могу предложить решение проблемы с хранением других видов переменных: просто для каждого типа создать свой префикс (если такое возможно)... Там же код вида "0х[числа]" - вместо ноля подставлять другие числа, и все (правда, все равно будет ограничение - 10 типов переменных MAX) (сразу прошу прощения за мое полное незнание в этом вопросе :)) |
|
![]() |
#3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
agentex
![]() offline
Опыт:
34,834Активность: |
Цитата:
фтопку. кому это тогда нужно? Плюс все это можно спокойно сделать без вжасса |
|
![]() |
#4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Ranger21
I love beatiul days XD
![]() ![]() offline
Опыт:
13,274Активность: |
Да уж... алгоритмика и внедрение в варик прочих вещей это конечно хорошо, но всё это можно реализовать по другому :P |
![]() |
#5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
NETRAT
![]() ![]() offline
Опыт:
83,712Активность: |
hash = hash у тебя написано неправильно мда, если это работает быстрее того что прошито в движок, видимо gamecache имеет невероятно карявую реализацию Отредактировано NETRAT, 27.05.2009 в 14:27. |
![]() |
#6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
user_jasser
![]() offline
Опыт:
232Активность: |
NETRAT
Да это работает быстрее.. Я согласен с утверждением, что интерпретаторы по определению в раз 10 медленей и жасс этому далеко не исключение, но всеже это работает так как я написал выше. Это при том что gamecache имел равные права.. Отредактировано user_jasser, 27.05.2009 в 16:31. |
![]() |
#7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|