Go 1.27 подменил движок encoding/json. Замерил три конфигурации и нашёл, где стало хуже
В Go 1.27 пакет encoding/json остался тем же по API и перестал быть тем же внутри: теперь это тонкий слой совместимости поверх нового encoding/json/v2. Обещание Go 1 выполняется честно, старый код компилируется и ведёт себя как раньше, но цифры под ним поменялись, причём в обе стороны. Я собрал go1.27.0 из исходников, взял старый go1.24.7 для контроля и прогнал одинаковые бенчмарки в четырёх конфигурациях. Разбор ниже: где выиграли, где потеряли полтора раза на ровном месте, что именно уже изменилось в выводе v1, и какие грабли ждут при переходе на v2.
Коротко для тех, кто спешит: анмаршалинг в структуры ускорился примерно в полтора раза без единой правки в коде; анмаршалинг в any и map[string]any замедлился в полтора раза, причина найдена и сводится к одному флагу совместимости; маршалинг стал чуть медленнее по времени, но заметно экономнее по аллокациям; байты на выходе v1 в редких случаях изменились, тексты ошибок изменились чаще; переход на v2 даёт лучшие цифры во всех сценариях, включая any, но ломает семантику в шести местах, из которых одно ломается тихо.
https://habr.com/ru/articles/1078082/
Post #3614
10.9K

- 🔥 19
- 👍 9
- ❤ 5
- 🤔 1
- 😢 1