remake hash_set realization. rm indexing

This commit is contained in:
2026-08-06 13:39:43 +03:00
parent 3efd0bf037
commit 3ecc491022
3 changed files with 474 additions and 694 deletions
+20 -10
View File
@@ -1,11 +1,15 @@
В этой реалзации попытка хранить хэш функции напрямую, без кодирования
В этой реализации хэши хранятся напрямую, без Golomb-Rice-кодирования.
В теории это должно увеличить размер set-строки ~x2, но
Set-строка целиком декодируется и проверяется при первом обращении. Как и в
`set9.c`, полностью декодированные массивы хэшей сохраняются в двух LRU-кэшах
по 512 записей — отдельно для первого и второго операнда.
- позволить индексироваться по элементам хэша
- кратно сократить время на дешифровку
- кэшировать можно соответствия индекс - значение, чтобы не работать с битами (может и не стоит того)
- стоит этого
Для 32-битного формата Base64
декодируется сразу в три `unsigned` за блок с одновременной проверкой порядка.
Большое понижение BPP выполняется radix-сортировкой, а не отдельным проходом на
каждый бит.
Последний запуск `taskset -c 2 python3 benchmark.py`:
```text
symbols=1000 required=500 bpp=32
@@ -14,8 +18,14 @@ set9 3994 golomb/base62
direct 5340 D1/base64
operation set9 direct direct/set9
set_fini only 150.44 us 99.28 us 0.66x
new+add+fini 1034.22 us 949.62 us 0.92x
rpmsetcmp cold 292.86 us 210.30 us 0.72x
rpmsetcmp warm 5.89 us 23.02 us 3.91x
set_fini only 147.45 us 105.09 us 0.71x
new+add (ctypes) 611.28 us 608.24 us 1.00x
new+add+fini (ctypes) 769.66 us 693.60 us 0.90x
rpmsetcmp cold 129.67 us 113.04 us 0.87x
rpmsetcmp warm 2.99 us 1.04 us 0.35x
```
Для разреженного сравнения
(`taskset -c 2 python3 benchmark.py --required 1`) получено
`83.22 us` на холодном кэше и `0.86 us` на прогретом: соответственно `0.88x`
и `1.02x` от времени `set9`.