|
|
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
System.Generics.Defaults.pas Код: pascal 1. 2. 3. 4. Такая фигня? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 00:52:23 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
rgreatТакая фигня?Угу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 03:26:40 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
rgreatЭти дятлы расчитывали(!) бобом дженкинсом(!) хэши для 1-4 байтных целых. Они не дятлы, просто для универсального, во всех отношениях, TDictionary, по дефолту, выбран обладающий хорошим лавинным эффектом (читай, подходящий для всех типов ключей) Дженкинс. При этом предоставлен механизм замены компарера, где можно реализовать какой угодно хеш. Вот где они налажали, так это в установлении Capacity. Кстати, когда я смотрел на применение словаря в VCL/FMX, то не видел мест, где используются кастомные компареры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 09:07:22 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Зачем вообще нужна хеш функция для integer? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 14:23:29 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
rgreatЗачем вообще нужна хеш функция для integer? Я не знаю чем руководствовались в абракадабре, но думаю, что они ориентировались на средний вариант. Например, если мы берём в качестве ключа integer и заполняем таблицу миллионом последовательных ключей, то простое проецирование ключа на хеш даёт хороший результат. Но если мы вставляем миллион рандомных ключей, то производительность деградирует в разы, тогда, как хеш Дженкинса даёт стабильно одинаковый результат. Потестируй у себя, может что интересное получится. У меня, на AMD, Дженкинс немногим медленне худшего случая с рандомными ключами, вдруг у тебя быстрее окажется :) Кстати, тут ещё могу привести пример, когда медленный Дженкинс уделывает быстрого Седжвика. Я тестировал свою таблицу на nextgen-компиляторе (XE5-6), и несмотря на более быстрый хеш Седжвика и более выгодную организацию данных она совсем немого но опережала дефолтный словарь с Дженкинсом. На последних версиях (XE8-10) моя таблица стабильно медленне дефолтного словаря, хотя тоже очень не на много. После того, как я заменил у себя Седжвика на Дженкинса, моя таблица снова стала быстрее на nextgen, несмотря на то, что Дженкинс медленне. Разница только в компиляторе и архитектуре процессора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 16:07:06 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Раз уж пошла такая пьянка... Вот набор целочисленных ключей, на которых медленный Дженкинс рвёт в клочья прямое проецирование ключа на хеш: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Понятное дело, что пример искусственный, но в жизни-то всякое бывает. На этом наборе ключей скорость поиска с Дженкинсом в 55 раз быстрее проецирования, а скорость вставки в 61 раз быстрее. А всё что мы сделали, это сосредоточили входы 1 млн. ключей в первых 995 тыс. яцеек таблицы. Таким образом на проецировании получается 5 тыс. коллизий на входе в таблицу, а у Дженкинса их более 200 тыс., но за счёт хорошего распределения у него очень короткие цепочки, что в результате позволяет ему выиграть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 18:16:05 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyРаз уж пошла такая пьянка... Вот набор целочисленных ключей, на которых медленный Дженкинс рвёт в клочья прямое проецирование ключа на хеш: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Понятное дело, что пример искусственный, но в жизни-то всякое бывает. На этом наборе ключей скорость поиска с Дженкинсом в 55 раз быстрее проецирования, а скорость вставки в 61 раз быстрее. А всё что мы сделали, это сосредоточили входы 1 млн. ключей в первых 995 тыс. яцеек таблицы. Таким образом на проецировании получается 5 тыс. коллизий на входе в таблицу, а у Дженкинса их более 200 тыс., но за счёт хорошего распределения у него очень короткие цепочки, что в результате позволяет ему выиграть.Я в восхищении от твоей способности подобрать такой тест кейс. Но достаточно поменять в нем 1 цифру и Дженкинс опять проиграет. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 18:41:21 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyrgreatЗачем вообще нужна хеш функция для integer? Я не знаю чем руководствовались в абракадабре, но думаю, что они ориентировались на средний вариант. Например, если мы берём в качестве ключа integer и заполняем таблицу миллионом последовательных ключей, то простое проецирование ключа на хеш даёт хороший результат. Но если мы вставляем миллион рандомных ключей, то производительность деградирует в разы, тогда, как хеш Дженкинса даёт стабильно одинаковый результат. Потестируй у себя, может что интересное получится. У меня, на AMD, Дженкинс немногим медленне худшего случая с рандомными ключами, вдруг у тебя быстрее окажется :) Вот такой код у меня стабильно медленней на дженкинсе. Код: pascal 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 18:54:54 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
rgreatНо достаточно поменять в нем 1 цифру и Дженкинс опять проиграет. :) Это и понятно, но замена той же цифры может затормозить проецирование вообще в бесконечность. Вот тебе готовый сценарий для DOS-атаки, на таблицу ;) rgreatВот такой код у меня стабильно медленней на дженкинсе. На сколько, в процентном отношении? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 19:00:15 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
rgreat, Кстати, если мне не изменяет память, у тебя таблица разруливала коллизии методом цепочек. Если всё так, то её этот вариант радикально затормозить не должен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 19:05:53 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexeyrgreat, Кстати, если мне не изменяет память, у тебя таблица разруливала коллизии методом цепочек. Если всё так, то её этот вариант радикально затормозить не должен.Угу. Она у меня скажем так "стабильно не очень быстрая". Соседние коллизии друг на друга не влияют, но зато идет высокая нагрузка на менеджер памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 19:12:32 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyНа сколько, в процентном отношении? Дженкинс: Add 10.000 integers in 10.000.000 iterations. 625 msec Без него: Add 10.000 integers in 10.000.000 iterations. 312 msec. в 2 раза. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 19:14:10 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
rgreatСоседние коллизии друг на друга не влияют, но зато идет высокая нагрузка на менеджер памяти. На nextgen не проверял, а то там с менеджером совсем плохо? rgreatв 2 раза. О! У меня всего 20-25% ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 19:18:11 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyО! У меня всего 20-25% Это от того, что у меня верхняя граница High(Integer); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 19:48:34 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyKazantsev AlexeyО! У меня всего 20-25% Это от того, что у меня верхняя граница High(Integer);Похоже на то. Но этот случай для ключей не очень вероятный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 19:53:55 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyНа nextgen не проверял, а то там с менеджером совсем плохо? Думаю там многое будет зависить от конкретной реализации в OS. Да и разброс в железе велик. Замучаешься выводить закономерности. Небось придется делать свой микро-менеджер памяти внутри цепочки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 19:56:05 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Вот мой тестовый пример. http://www.rgreat.ru/tmp/Test.zip Я там базовые модули Generics.* переименовал в Indexes.* для простоты. Для теста достаточно в Indexes.Collections.Pas поменять Uses Код: pascal 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 19:58:17 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
У меня с базовыми TDictionary результат пока такой: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. Но там еще есть чего оптимизировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 20:00:32 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
TDictionary без Дженкинса: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 20:06:13 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
rgreatДумаю там многое будет зависить от конкретной реализации в OS. Да и разброс в железе велик. Просто там FastMM'а нет :) rgreatНебось придется делать свой микро-менеджер памяти внутри цепочки. Мне в паре мест пришлось менять алгоритм работы с памятью :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 20:07:44 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyПросто там FastMM'а нет :)Потому и будет. :) Может через пару лет и FastMM допилят для NextGen? ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 20:11:27 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2017, 15:45:43 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
обновил статью и исходник в свете последних обсуждений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2017, 00:04:08 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
rgreat, на таком же тесте с моим словарем на E6850 времена такие 1357 203 78 Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2017, 00:55:07 |
|
||
|
|

start [/forum/topic.php?fid=58&startmsg=39384886&tid=2041988]: |
0ms |
get settings: |
5ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
243ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
218ms |
get tp. blocked users: |
2ms |
| others: | 185ms |
| total: | 685ms |

| 0 / 0 |
