TGViewer
Библиотека Go-разработчика | Golang Библиотека Go-разработчика | Golang @goproglib · 24.1K subscribers
Post #7133 3.56K
⚡️ Быстрый JSON от ByteDance

Стандартная библиотека 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
  • 👍 14
  • ❤ 9
  • 🔥 4
More from @goproglib
  1. Sep 30, 2026🧑‍💻 Эмулятор AWS-сервисов Kumo — это небольшой инструмент на Go для локальной имитации A…
  2. Sep 29, 2026👨‍💻 Библиотека для написания LSP-серверов Написать свой Language Server с нуля на Go сло…
  3. Sep 28, 2026🤔 Вопрос с собеседования по Go Что выведет программа? ❤️ — 1 true / 0 false 🔥 — 1 true /…
  4. Sep 28, 2026👩‍💻 Что на самом деле происходит внутри Go map? После Go 1.24 обычный map внутри работае…
  5. Sep 26, 2026🔥 В Go 1.27 появился portable SIMD До этого SIMD-оптимизации в Go требовали архитектурног…
  6. Sep 25, 2026🤡🤡 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoGiggle
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →