Потому что это быстро. x4982 сокращение использования памяти и хранилища с помощью тестов ниже.
Ok. Что за черт?
Сборщик мусора запускается через определенные промежутки времени. Если ваш код постоянно выделяет память в некоторых структурах данных, а затем освобождает их, это требует постоянной работы сборщика, большего использования памяти и ЦП для выделения ресурсов в структурах инициализации.
The comments on sync/pool.go say that: A Pool is a set of temporary objects that may be individually saved and retrieved. A Pool is safe for use by multiple goroutines simultaneously.
sync.Pool позволяет нам повторно использовать память без выделения.
Также, если у вас есть http-сервер, который ожидает почтовых запросов с телом json и должен декодировать в структуру, вы можете использовать sync.Pool для экономии памяти и сокращения времени ответа сервера.
синхронизация использования пула
sync.Pool конструкция проста:
var bufferPool = sync.Pool{ New: func() interface{} { return new(bytes.Buffer) }, }
Теперь у вас есть пул, который будет создаваться, и новые буферы. Вы можете получить свой первый буфер здесь:
buffer := bufferPool.Get().(*bytes.Buffer)
Метод get вернет уже существующий * bytes.Buffer в пуле, и если он не вызовет метод New, который инициирует новые * байты .Buffer
Но после использования буфера вы должны сбросить его и вернуть в пул:
buffer.Reset() bufferPool.Put(buffer)
Бенчмаркинг
Кодирование json в bytes.Buffer
// That code tried to json encode structure BenchmarkReadStreamWithPool-8 5000000 384 ns/op 0 B/op 0 allocs/op BenchmarkReadStreamWithoutPool-8 3000000 554 ns/op 160 B/op 2 allocs/op
У нас есть прирост производительности на 44% и очень большая экономия памяти (160 бит / с по сравнению с 0 бит / с)
Запись байтов в bufio.Writer
BenchmarkWriteBufioWithPool-8 10000000 123 ns/op 128 B/op 2 allocs/op BenchmarkWriteBufioWithoutPool-8 2000000 651 ns/op 4288 B/op 4 allocs/op
У нас есть увеличение производительности в 5 раз и уменьшение использования памяти в 32 раза
Расшифровка json в структуру
BenchmarkJsonDecodeWithPool-8 1000000 1729 ns/op 1128 B/op 8 allocs/op BenchmarkJsonDecodeWithoutPool-8 1000000 1751 ns/op 1160 B/op 9 allocs/op
У нас есть прирост производительности на 1%, потому что декодирование json - это слишком сложная операция, и мы не видим нормального повышения за счет повторного использования структур.
Gzip байт
BenchmarkWriteGzipWithPool-8 500000 2339 ns/op 162 B/op 2 allocs/op BenchmarkWriteGzipWithoutPool-8 10000 105288 ns/op 807088 B/op 16 allocs/op
Стоп что? x45 повышение производительности и x4982 сокращение использования памяти
Заключение
По возможности всегда используйте sync.Pool! Это действительно экономит память и увеличивает производительность вашего приложения.
Репозиторий Github с тестами здесь.
📝 Прочтите этот рассказ позже в Журнале.
👩💻 Просыпайтесь каждое воскресное утро и слушайте самые интересные истории из области технологий, ожидающие вас в вашем почтовом ящике. Прочтите информационный бюллетень« Примечательно в технологиях .