Performance

Postgres как очередь: SKIP LOCKED без отдельного брокера

Postgres как очередь: SKIP LOCKED без отдельного брокера

Очередь задач прямо в PostgreSQL: что на самом деле покупает FOR UPDATE SKIP LOCKED (не корректность), сколько стоит LISTEN/NOTIFY против опроса, почему очередь — худший случай для MVCC, где начинается потолок пропускной способности и что его задаёт: насыщение сбросов журнала и группировка коммитов, снятые прямым замером

Дженерики в Go: type parameters, constraints и цена под капотом

Дженерики в Go: type parameters, constraints и цена под капотом

Дженерики в Go (1.18+) — не мономорфизация как в C++ и не стирание как в Java, а GC-shape stenciling со словарями. Разбираем type parameters и constraints (~, comparable, интерфейсы-ограничения), инференс типов, как это работает под капотом и что стоит — на живом стенде с бенчмарками: дженерик vs interface{} vs рукопись, и почему на указательных типах дженерик не быстрее интерфейса

encoding/json/v2 в Go 1.27: вы уже переехали, не написав ни строки

encoding/json/v2 в Go 1.27: вы уже переехали, не написав ни строки

encoding/json в Go 1.27 работает поверх нового движка v2 по умолчанию — обновивший тулчейн уже переехал, ничего не переписывая. На бенчах стенда это стоит decode в полтора-два раза дороже, а поведение при этом не меняется вовсе: строгость и выигрыш по аллокациям даёт только явный переход на encoding/json/v2 и потоковый jsontext.

Один поток и событийный цикл: откуда у Redis скорость

Один поток и событийный цикл: откуда у Redis скорость

Redis обрабатывает команды в одном потоке — и при этом отдаёт сотни тысяч операций в секунду. Разбираем, почему single-threaded не значит медленно: событийный цикл, I/O-мультиплексирование, threaded I/O в новых версиях, пайплайнинг. И честно про обратную сторону: где один поток становится узким местом и откуда берётся хвостовая latency.

Память в Go: стек, куча и escape-анализ

Память в Go: стек, куча и escape-анализ

Где живёт значение — на стеке или в куче — в Go решает не программист, а escape-анализ компилятора. Что уводит переменную в кучу (возврат указателя, боксинг в interface, захват замыканием), как это увидеть через go build -gcflags=-m, чем это грузит сборщик мусора и как проверять бенчами — на живом стенде с реальным выводом

reflect в Go: когда оправдана рефлексия и чего она стоит

reflect в Go: когда оправдана рефлексия и чего она стоит

reflect даёт доступ к типам и значениям в рантайме — на нём стоят encoding/json, ORM, валидаторы. Но за гибкость платят: потеря типобезопасности, аллокации и заметное замедление. Разбираем Type/Value/Kind, изменяемость через reflect, три закона рефлексии и её цену — на бенчмарках рефлексия против прямого доступа