Автор профилировал свою многопоточную реализацию Redis на Go и обнаружил, что одна строка кода `s.kvList[k] = append(v[popped:], s.kvList[k]...)` за время бенчмарка суммарно аллоцировала 687 ГБ памяти. Реально приложение держало в памяти лишь около 4,58 МБ. В чем прикол?
Проблема была в том, что LPUSH каждый раз создавал новый массив и копировал весь существующий список, давая O(n²) по аллокациям, тогда как RPUSH использовал штатную стратегию роста слайсов с амортизированным O(1).
Замена на deque с двумя индексами, растущий от середины в обе стороны, ускорила LPUSH в 33 раза, а аллокации упали с 715 ГБ до 27 ГБ
Нужно быть внимательным
27.07.2026
Похожее
26.07.2026
HTMX с Go
Автор детально описывает свои паттерны интеграции HTMX с Go. Почитайте, там мног...
23.07.2026
Убираем ограничения
Автор разбирает продвинутый прием устранения проверки границ в горячих путях Go ...
21.07.2026
OpenTelemetry в комптайме
Разрабы OpenTelemetry объявили о первом стабильном релизе Go Compile-Time Instru...
19.07.2026
Объединение запросов
Статья объясняет технику объединения запросов на Go с помощью пакета singlefligh...