Стандартная библиотека
encoding/json в Go работает медленно на больших объёмах данных. Если сервис обрабатывает тысячи запросов в секунду с тяжёлыми JSON-структурами, это становится заметным узким местом.Sonic это библиотека для сериализации и десериализации JSON, которая использует JIT-компиляцию и SIMD-инструкции процессора. Она полностью совместима с API
encoding/json, то есть замена происходит в одну строку.Что под капотом
Sonic генерирует машинный код под конкретную схему данных прямо во время выполнения, а не в момент компиляции. SIMD позволяет обрабатывать несколько байт одновременно на уровне железа.
В итоге на средних JSON (13 КБ, 300+ ключей) скорость кодирования достигает 2468 МБ/с против 792 МБ/с у стандартной библиотеки.
Установка:
go get github.com/bytedance/sonic
Базовое использование
Замена
encoding/json буквально в одну строку:import "github.com/bytedance/sonic"
var data YourSchema
// Кодирование
output, err := sonic.Marshal(&data)
// Декодирование
err := sonic.Unmarshal(output, &data)
Стриминг
Sonic поддерживает потоковое чтение из
io.Reader и запись в io.Writer:var o = map[string]interface{}{}
var r = strings.NewReader(`{"a":"b"}{"1":"2"}`)
var dec = sonic.ConfigDefault.NewDecoder(r)
dec.Decode(&o)
dec.Decode(&o)
fmt.Printf("%+v", o)
// map[1:2 a:b]Частичный парсинг через ast.Node
Если нужно вытащить одно поле из большого JSON, не парся всё целиком:
import "github.com/bytedance/sonic"
node, err := sonic.GetFromString(twitterJson, "statuses", 3, "user")
var user User
err = sonic.UnmarshalString(node.Raw(), &user)
Pretouch для тяжёлых схем
Sonic компилирует код при первом вызове. Если схема большая, первый запрос может подвиснуть.
Чтобы этого избежать, компилируем заранее при старте приложения:
import (
"reflect"
"github.com/bytedance/sonic"
)
func init() {
var v HugeStruct
err := sonic.Pretouch(reflect.TypeOf(v))
}
Готовые конфиги
•
sonic.ConfigDefault — быстрый режим по умолчанию•
sonic.ConfigStd — совместимый со стандартной библиотекой•
sonic.ConfigFastest — максимальная скорость, без дополнительных проверокНа платформах без поддержки JIT Sonic автоматически откатывается к
encoding/json.➡️ Репозиторий
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoToProduction
