|
|
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
rgreatAleksandr SharahovМы боремся не с атакой на хеш. Это бред. Мы боремся с регулярностью ключа. А это реальность.Надежней через Capacity это решить. При условии что положение в листе ищется через n:=Value mod Capacity. И коллизий не будет и в скорости не потеряешь. Пример. Capacity=256*1024 Заполняем на 3/4, N=3*64*1024 элементов. Ключи вида K=I*256, I=0..N-1. Имеем K mod Capacity = I*256 mod (256*1024), итого 1024 разных значения модуля, т.е. в каждый из 1024 кластеров попадет N/1024=3*64=192 ключа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 01:49:32 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUЗавершил бенчмарки для проекта Rapid.Generics Ни в одной из этих версий не компилируется: XE2, XE3, XE6, XE7, 10.1 Berlin. (commit: aadf2824eb9003154f5ab048092df53c4fc12c38) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 02:29:23 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUrgreatПроверь разницу. Лень Там исходники бенчмарка открыты, посмотри, если хочешь Вангую, что скорость будет как у TRapidGenerics Но я считаю, предложенный тобой способ не надёжен для универсального использования. Хотя в частных случаях годится - вполне Не угадал. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 02:33:45 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovПример. Capacity=256*1024 Заполняем на 3/4, N=3*64*1024 элементов. Ключи вида K=I*256, I=0..N-1. Имеем K mod Capacity = I*256 mod (256*1024), итого 1024 разных значения модуля, т.е. в каждый из 1024 кластеров попадет N/1024=3*64=192 ключаОпять частный случай. Сделай ключ I*255 или I*257 и проблема исчезает. Как я уже сказал подобрать правило можно под любой хэш в таблице с открытой адресацией. Перебор разных хешей это не более чем игры в угадайку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 02:50:27 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Хотя про "коллизий не будет" это я глупость сказал, конечно. Не подумавши. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 02:51:42 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
rgreatНе угадал. Не :) Я имел ввиду, если ты InterfaceDefaults.GetHashCode_N4 подменишь А вообще буст виден, согласен. Только я на такое в универсальной либе так и не решусь :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 04:48:13 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeySOFT FOR YOUЗавершил бенчмарки для проекта Rapid.Generics Ни в одной из этих версий не компилируется: XE2, XE3, XE6, XE7, 10.1 Berlin. (commit: aadf2824eb9003154f5ab048092df53c4fc12c38) У меня как раз XE8 :) А что ругается? Internal error? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 04:49:29 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUБлин, хотел модуль Шарахова добавить, а UnicodeString нет, RawByteString-таблица основана на поле в обжекте Нет, хватит париться ) Жаль, что твоя гнедая сломала ногу ) Во-первых, заметил небольшую неточность. Тест на время заполнения учитывает время создания словаря и время заполнения, но не учитывает время освобождения. Учел. Во-вторых, ты ж понимаешь, что разницы между UnicodeString и RawByteString в данном нашем случае нет никакой, все особенности легко учитываются внутри хеш-функции. В-третьих, чтобы использовать "поле в обжекте" достаточно умения работать с указателями. В общем добавил немного отсебятины в твой код: Код: 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. скомпилировал на XE8 и прогнал на E6850, результаты ниже: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. женерики наше все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 13:21:59 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovВо-первых, заметил небольшую неточность. Тест на время заполнения учитывает время создания словаря и время заполнения, но не учитывает время освобождения. Учел. Не совсем понял, что ты имеешь ввиду Операцию Delete или Clear? Delete показала бы превосходство моего кода, но Delete происходит редко, поэтому я решил не добавлять в тест Clear тоже не медленнее... на Integer разницы быть не должно, для string разница незначительна. Хотя... в оригинале вроде виртуальные калбеки дёргаются, я уже не помню Aleksandr SharahovВо-вторых, ты ж понимаешь, что разницы между UnicodeString и RawByteString в данном нашем случае нет никакой, все особенности легко учитываются внутри хеш-функции. Не понятно, это ты к чему? Я не против RawByteString :) Aleksandr SharahovВ-третьих, чтобы использовать "поле в обжекте" достаточно умения работать с указателями. Что-то я не понял. А к чему тогда поле Offset? Aleksandr SharahovВ общем добавил немного отсебятины в твой код: скомпилировал на XE8 и прогнал на E6850, результаты ниже: женерики наше все. Так ты RawByteString и UnicodeString похоже сравниваешь. Во втором в 2 раза больше байт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 14:05:45 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovRandomize; Seed:=RandSeed; Сначала надо Seed сохранять, потом рандомайзить ) Ну и потом здесь специально нет рандомайза, чтобы сохранить одинаковость данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 14:08:41 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUAleksandr SharahovВо-первых, заметил небольшую неточность. Тест на время заполнения учитывает время создания словаря и время заполнения, но не учитывает время освобождения. Учел. Не совсем понял, что ты имеешь ввиду Я Instance.Free имею в виду У тебя так: Код: pascal 1. 2. 3. 4. логичее было бы так Код: pascal 1. 2. 3. 4. SOFT FOR YOUAleksandr SharahovВ-третьих, чтобы использовать "поле в обжекте" достаточно умения работать с указателями. Что-то я не понял. А к чему тогда поле Offset? Offset - это смещение поля внутри объекта или записи. В нашем тесте запись состоит из одного единственного строкового поля. Offset=0. SOFT FOR YOUТак ты RawByteString и UnicodeString похоже сравниваешь. Во втором в 2 раза больше байт Разумеется, но у нас с тобой хеш-функции не блобы обрабатывают, а строки посимвольно, т.е. на них это не влияет, т.к. количество операций одинаково. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 14:21:27 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUAleksandr SharahovRandomize; Seed:=RandSeed; Сначала надо Seed сохранять, потом рандомайзить ) Ну и потом здесь специально нет рандомайза, чтобы сохранить одинаковость данных Ты бы разобрался сначала. Так сделано, чтобы генератор крутился с одного значения и у тебя и у меня. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 14:23:25 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovРазумеется, но у нас с тобой хеш-функции не блобы обрабатывают, а строки посимвольно, т.е. на них это не влияет, т.к. количество операций одинаково. Ну у меня данные обрабатываются не посимвольно, а группами байт И потом ты забываешь про компаратор и кеш-мисс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 14:35:34 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUAleksandr SharahovРазумеется, но у нас с тобой хеш-функции не блобы обрабатывают, а строки посимвольно, т.е. на них это не влияет, т.к. количество операций одинаково. Ну у меня данные обрабатываются не посимвольно, а группами байт И потом ты забываешь про компаратор и кеш-мисс Ну, все в твоих руках, напиши женерик для Raw ) Я не забываю, я на этом как раз играю в своем словаре. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 14:39:33 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
[quot Aleksandr Sharahov]SOFT FOR YOUНу, все в твоих руках, напиши женерик для Raw ) Я не забываю, я на этом как раз играю в своем словаре. Так у меня есть и RawByteString, и DynamicArray, и структуры, и всё что хочешь :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 14:41:19 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUИ потом ты забываешь про компаратор и кеш-мисс В твоих тестах строковый компарер не отрабатывает по данным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 14:44:28 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, Отрабатывает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 14:46:09 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, У тебя же там один массив под ключи. И когда ты ищешь все ключи, то фактически, у одинаковых строк сравниваются только адреса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 14:49:01 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeySOFT FOR YOU, У тебя же там один массив под ключи. И когда ты ищешь все ключи, то фактически, у одинаковых строк сравниваются только адреса. Обижаешь :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 14:50:22 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUОбижаешь :) Где я могу увидеть создание копий ключей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 14:54:01 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Замена string на RawByteString не добавила скорости твоему словарю: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 14:56:55 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Виноват, *почти* не добавила ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 15:00:46 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeySOFT FOR YOUОбижаешь :) Где я могу увидеть создание копий ключей? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Если бы сравнивались только указатели, то в данном случае был бы Exception А посмотреть - только трейсить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 15:06:48 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovЗамена string на RawByteString не добавила скорости твоему словарю: Любопытно, я посмотрю А ты точно в Release сравниваешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 15:07:44 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUAleksandr SharahovЗамена string на RawByteString не добавила скорости твоему словарю: Любопытно, я посмотрю А ты точно в Release сравниваешь? На самом деле небольшое ускорение есть, но все равно моя чуточку быстрее, т.к. не хранит "лишних" данных. Точно релиз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 15:11:18 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39422493&tid=2041988]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
194ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 224ms |
| total: | 498ms |

| 0 / 0 |
