Перейти к содержимому

Сборка с заменой JSON

Gin по умолчанию использует стандартный пакет encoding/json для сериализации и десериализации JSON. Стандартный кодировщик хорошо протестирован и полностью совместим, но он не является самым быстрым доступным вариантом. Если производительность JSON является узким местом в вашем приложении — например, в высоконагруженных API, которые сериализуют большие объёмы данных в ответах — вы можете подключить более быструю замену на этапе сборки с помощью тегов сборки. Изменения в коде не требуются.

Доступные замены

Gin поддерживает три альтернативных JSON-кодировщика. Каждый из них реализует тот же интерфейс, который ожидает Gin, поэтому ваши обработчики, middleware и логика привязки продолжат работать без изменений.

go-json

go-json — это JSON-кодировщик на чистом Go, который обеспечивает значительное улучшение производительности по сравнению с encoding/json, сохраняя полную совместимость. Работает на всех платформах и архитектурах.

Окно терминала
go build -tags=go_json .

jsoniter

jsoniter (json-iterator) — ещё одна высокопроизводительная JSON-библиотека на чистом Go. Она совместима с API encoding/json и предоставляет гибкую систему конфигурации для продвинутых сценариев использования.

Окно терминала
go build -tags=jsoniter .

sonic

sonic — это сверхбыстрый JSON-кодировщик, разработанный ByteDance. Он использует JIT-компиляцию и SIMD-инструкции для достижения максимальной пропускной способности, что делает его самым быстрым вариантом из трёх.

Окно терминала
go build -tags="sonic avx" .

Выбор замены

КодировщикПоддержка платформКлючевое преимущество
encoding/json (по умолчанию)ВсеМаксимальная совместимость, без дополнительных зависимостей
go-jsonВсеХорошее ускорение, чистый Go, широкая совместимость
jsoniterВсеХорошее ускорение, гибкая конфигурация
sonicТолько x86_64 с AVXМаксимальная пропускная способность через JIT и SIMD

Для большинства приложений go-json — безопасный и эффективный выбор: он работает везде и обеспечивает заметный прирост производительности. Выбирайте sonic, когда вам нужна максимальная пропускная способность JSON, а ваши серверы работают на оборудовании x86_64. Выбирайте jsoniter, если вам нужны его специфические возможности конфигурации или вы уже используете его в другом месте вашего кода.

Проверка замены

Вы можете убедиться, что замена активна, сравнив производительность сериализации с помощью простого бенчмарка или проверив таблицу символов бинарного файла:

Окно терминала
# Сборка с go-json
go build -tags=go_json -o myapp .
# Проверка наличия символов go-json
go tool nm myapp | grep goccy

Тег сборки также работает с другими командами Go:

Окно терминала
go run -tags=go_json .
go test -tags=go_json ./...