Производительность

Тема дорожной карты · Golang

Производительность Go — это эффективность выполнения Golang-программ с точки зрения пропускной способности, задержки и потребления памяти; эти качества обусловлены компилируемой природой языка, лёгкими goroutines и низкоуровневым сборщиком мусора. Goroutines мультиплексируются на потоки ОС планировщиком Go-рантайма, позволяя выполнять тысячи конкурентных операций с минимальными накладными расходами на стек каждой goroutine (начиная с ~2 КБ) — ключевая причина, по которой производительность Go опережает модели с потоком на запрос в высококонкурентных бэкендах. Измерение производительности Go начинается с go test -bench=. -benchmem для получения базовых показателей наносекунд на операцию и байт на выделение, а также go tool pprof для определения функций, доминирующих по использованию CPU или памяти в продакшен нагрузках. Сборщик мусора Go конкурентен и обеспечивает низкую задержку, но всё же запускается при росте кучи, поэтому настройка производительности Go часто предполагает снижение выделений через sync.Pool, типы-значения в стеке и слайсы, предварительно выделенные через make([]T, 0, n). Флаги компиляции (go build -gcflags="-m") раскрывают решения escape-анализа, а race detector (go test -race) обнаруживает гонки данных, вызывающие периодическую деградацию производительности в конкурентных Golang-сервисах.

Как это работает

Производительность использует pprof (CPU, memory, goroutine, block, mutex-профили), бенчмарки (go test -bench=.), trace-инструмент (go test -trace=trace.out + go tool trace), execution tracer для scheduling goroutines. -race-детектор для race conditions. Обычные победы: меньше аллокаций (sync.Pool, []byte slices, value-типы), избегать reflection в горячих путях, strings.Builder для конкатенации, профайл до оптимизации.

Когда применять

Всегда профайл до оптимизации — Go's pprof встроен и дружелюбен. pprof.StartCPUProfile в production за net/http/pprof (admin-эндпойнт, IP-restricted). Меньше аллокаций — обычно главная победа; вывод escape analysis (go build -gcflags="-m") показывает, что аллоцирует на heap vs stack.

Типичные ошибки

Ловушки Производительность: микрооптимизация без замеров (Go-компилятор умный, преждевременная оптимизация часто вредит); sync.Pool для объектов, создаваемых раз на запрос (overhead pool > выгоды на низких rate); тюнинг GOGC по интуиции, не по бенчмарку (дефолт 100 обычно ок).

Связанные понятия

Полезные ресурсы