Конкурентно-безопасная карта
Лирическое отступление. Обычная карта в Go никогда не скукоживается, только растет пока не поглотит вселенную. GC не освобождает память, занятую самой картой, даже если удалять из нее элементы. Не изменилось это и в новой «швейцарской» карте в Go 1.24.
Но есть в Go еще одна карта, конкурентно-безопасная (sync.Map
). И по странному стечению обстоятельств, в Go 1.24 у нее тоже новая реализация! Теперь она основана на concurrent hash-trie (помесь хэш-таблицы и префиксного дерева) и работает быстрее, особенно при модификациях карты.
Кроме того, новая sync.Map
лучше освобождает память, чем предыдущая. Та тоже умела это делать, но там использовалась «поколенческая» модель, и память собиралась с запаздыванем. В новой никаких поколений нет, и память освобождается по мере удаления элементов.
Исходно новую расчудесную карту сделали для пакета unique в Go 1.23 — там как раз нужен был конкурентно-безопасный кэш. А теперь заметили, что и для пакета sync
новая реализация отлично подходит. В результате, sync.Map
теперь по сути фасад к HashTrieMap
.
Если вы страшный ретроград, вернуться к старой sync.Map
можно через переменную GOEXPERIMENT=nosynchashtriemap
при сборке.
★ Подписывайтесь на новые заметки.