|
|
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. навострячил тут LRU простенький как часть более крупной задачи. HashMap и список. HashMap на TDictionary<integer,TMyClass> в задаче понатыкано счетчиков производительности. заместо AQtime ) И получилось, что очень большую часть времени отъедает LRU. Начала смотреть и все уперлось в TDictionary А точнее в map.ContainsKey(key) и в node:=map[key]; статистика по LRU примерно такая. Время в секундах lru.get только hashmap 0,648279488394491 (map.ContainsKey(key) и node:=map[key]) lru.get только все остальное 0,408678524370626 lru.put 0,00645377100622397 get counter 3315095 put counter 7185 Собственно вопрос. А можно как то ускорить?) или это предел для TDictionary и вообще для hashmap? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2019, 00:44 |
|
||
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
вернее даже так lru.get только hashmap 0,961819743242614 lru.get только все остальное 0,159336854435245 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2019, 00:46 |
|
||
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
Замени TEqualityComparer на свой. Код: 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. Далее: Код: pascal 1. 2. Разница: default1. Benchmark TDictionary<Integer,Integer> Add 10.000.000 integers. 1907 msec. Add 10.000 integers in 10.000.000 iterations. 500 msec. Locate 10.000 integers in 10.000.000 iterations. 422 msec. 2. Benchmark TDictionary<string,Integer> Add 1.000.000 GUIDs. 515 msec. Add 150844 strings in 10.000.000 iterations. 2016 msec. Locate 150844 strings in 10.000.000 iterations. 1875 msec. custom1. Benchmark TDictionary<Integer,Integer> Add 10.000.000 integers. 468 msec. Add 10.000 integers in 10.000.000 iterations. 156 msec. Locate 10.000 integers in 10.000.000 iterations. 94 msec. 2. Benchmark TDictionary<string,Integer> Add 1.000.000 GUIDs. 375 msec. Add 150844 strings in 10.000.000 iterations. 1656 msec. Locate 150844 strings in 10.000.000 iterations. 1547 msec. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2019, 01:16 |
|
||
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
Код: 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. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2019, 01:18 |
|
||
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
rgreat, а какова частота коллизий твоего хэша? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2019, 10:46 |
|
||
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
Да мне пофигу. Меня результат тестов устраивает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2019, 12:44 |
|
||
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
cptngrbrgreat, а какова частота коллизий твоего хэша? Это хеш Седжвика (RSHASH). Тут есть данные о коллизиях . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2019, 14:08 |
|
||
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
rashid.abzalov, с тех пор TDictionary afaik стал лучше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2019, 13:15 |
|
||
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
makhaonс тех пор TDictionary afaik стал лучше Да нифига. Хотя, конкретно эта проблема, решается на текущей реализации словаря, буквально, несколькими строчками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2019, 13:32 |
|
||
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
...ну, то есть, чуть лучше, конечно стал, но в целом, всё по-прежнему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2019, 13:41 |
|
||
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, меняя хэш-функцию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2019, 16:13 |
|
||
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
cptngrbKazantsev Alexey, меняя хэш-функцию? Нет, достаточно добавить случайный seed в компарер. Это поможет даже если будет использоваться очень простая хеш-функция. А у используемого Дженкинса можно указать initial value. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2019, 17:03 |
|
||
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, а где здесь используется Seed? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. если только a:=Seed; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 13:02 |
|
||
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
cptngrb, Седжвика можно модифицировать так: Result := Seed; Только seed должен быть результатом предыдущего хеширования этой-же функцией. То есть, выглядеть это может примерно так: Код: pascal 1. 2. 3. 4. 5. 6. В констркторе компарера: Код: pascal 1. В GetHashCode компарера: Код: pascal 1. Этот вариант решит проблему обозначенную в статье, но, от атаки hash-flooding не защитит. Аналогичные манипуляции для Дженкинса избавят и от hash-flooding. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 13:53 |
|
||
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
Если уж важна защита от флуда менять надо a:=a*378551; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 13:55 |
|
||
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
rgreat, Рандомно менять эти коэффициенты чревато ростом коллизий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 13:59 |
|
||
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, Меняйте через формулу, из простых чисел большого размера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 17:26 |
|
||
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
rgreat, Нужен-то рандом, иначе смысла никакого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 17:32 |
|
||
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, Сделать функцию генеряющую простое число от рандома - это проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 17:38 |
|
||
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
rgreat, Сколько таких простых чисел будет в результате? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 17:42 |
|
||
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, Достаточно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 19:45 |
|
||
|
Производительность TDictionary
|
|||
|---|---|---|---|
|
#18+
~5% от maxint - вполне достаточно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 19:49 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39806939&tid=2039517]: |
0ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
151ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 431ms |

| 0 / 0 |
