Comments 13
@andrey_shalamov Не могли бы вы пояснить механику работы вашей реализации Free List.
Как происходит, что память возвращается в список в методе Put, а не отбрасывается в ветке default?
Соответственно не понятен механизм выделения памяти из списка в методе Get.
основа - это работа с буферизированным каналом. Если в канале нет "свободных" буферов при вызове метода Get, мы создаём новый (ветка default). После того как мы воспользовались буфером, возвращаем его обратно в канал (метод Put). Если в канале "есть место", мы кладём буфер туда для переиспользования (метод Get вернёт нам этот буфер вместо создания нового). Иначе, мы переходим по ветке default и просто дропаем буфер.
а не пробовали сразу парсить из потока и кодировать в поток?
err = json.NewDecoder(r.Body).Decode(&fooReq)
err = json.NewEncoder(w).Encode(fooRes)
на случай когда нужно освежить в памяти что и как с профилированием в go держу в закладках статью @mkevac https://habr.com/ru/company/badoo/blog/301990/
В коде в шаге 1 вот эта строка лишння:b, err := ioutil.ReadAll(r.Body)
for _, foo := range *fooReq {
sha.Reset()
sha.Write(stringToBytes(&foo.StrA))
sha.Write(stringToBytes(&foo.StrB))
base64.StdEncoding.Encode(buf.Bytes(), sha.Sum(sha256Buf[:0]))
hashes = append(hashes, bytesToString(buf.Bytes()))
}
Микрооптимизация кода на Go на примере простого веб-сервиса