Size: a a a

2020 April 23

DP

Daniel Podolsky in Go-go!
надо смотреть
источник

DP

Daniel Podolsky in Go-go!
лучше сбрасывать, наверное
источник

DP

Daniel Podolsky in Go-go!
сброс - это же просто сброс счетчиков, больше ничего он не делает
источник

zl

ziggy lucid in Go-go!
а совместное использование bytes.Buffer и sync.Pool вообще потокобезопасно, если содержимое используется потребителем?
источник

zl

ziggy lucid in Go-go!
типа такого
func (c *Bytes) Encode(src, key []byte) []byte {
 buffer := c.pool.Get().(*bytes.Buffer)
 defer func() {
   buffer.Reset()
   c.pool.Put(buffer)
 } ()
 hex.NewEncoder(buffer).Write(xor(src, key))
 return buffer.Bytes()
}
источник

RS

Roman Sharkov in Go-go!
ziggy lucid
еще вопрос, перед возвращение bytes.Buffer в sync.Pool его надо сбрасывать?
buffer.Reset надо

и ещё рекомендую почитать: https://github.com/golang/go/issues/23199
источник

zl

ziggy lucid in Go-go!
судя по вот этому, то небезопасно
func (b *Buffer) Bytes() []byte { return b.buf[b.off:] }
источник

RS

Roman Sharkov in Go-go!
ziggy lucid
типа такого
func (c *Bytes) Encode(src, key []byte) []byte {
 buffer := c.pool.Get().(*bytes.Buffer)
 defer func() {
   buffer.Reset()
   c.pool.Put(buffer)
 } ()
 hex.NewEncoder(buffer).Write(xor(src, key))
 return buffer.Bytes()
}
я бы так не писал, я бы написал обёртку вокруг sync.Pool
источник

RS

Roman Sharkov in Go-go!
ziggy lucid
типа такого
func (c *Bytes) Encode(src, key []byte) []byte {
 buffer := c.pool.Get().(*bytes.Buffer)
 defer func() {
   buffer.Reset()
   c.pool.Put(buffer)
 } ()
 hex.NewEncoder(buffer).Write(xor(src, key))
 return buffer.Bytes()
}
ну а вообще buffer.Bytes вернёт слайс буфера, в зависимости от того что с ним дальше происходит это может быть опасно (ключевое слово: aliasing)
источник

zl

ziggy lucid in Go-go!
выходит, если байты из буфера используются снаружи, то смысла в sync.Pool для буферов вообще нет?
источник

RS

Roman Sharkov in Go-go!
ziggy lucid
выходит, если байты из буфера используются снаружи, то смысла в sync.Pool для буферов вообще нет?
sync.Pool для того, чтобы не allocate’ить заново большие буфера а переиспользовать их. Если мы за alias’им слайс буфера и передадим кому-то кто про сам буфер ничего не знает - это может быть опасно
источник

zl

ziggy lucid in Go-go!
а если buffer.Bytes() обернуть в string, это сделает возвращаемое значение потокобезопасным?
string(buffer.Bytes())
источник

RS

Roman Sharkov in Go-go!
ziggy lucid
а если buffer.Bytes() обернуть в string, это сделает возвращаемое значение потокобезопасным?
string(buffer.Bytes())
обернуть буфер в строку? это как?
источник

RS

Roman Sharkov in Go-go!
ziggy lucid
а если buffer.Bytes() обернуть в string, это сделает возвращаемое значение потокобезопасным?
string(buffer.Bytes())
это не оборачивание, это превращение.

в таком случае мы скопируем содержимое буфера в ново-созданную строку, это безопасно, но может быть не очень эффективно
источник

zl

ziggy lucid in Go-go!
а имеет смысл применение sync.Pool, если у меня объемы 200-300 байт всего?
источник

W

Wingman in Go-go!
тут не про обьемы, а про частоту и кол-во аллокаций
источник

RS

Roman Sharkov in Go-go!
ziggy lucid
а имеет смысл применение sync.Pool, если у меня объемы 200-300 байт всего?
зависит от ситуации. Мы говорим об устранении аллокаций. Если аллокаций много то можно поличить ощутимую разницу
источник

zl

ziggy lucid in Go-go!
так мне значение из буфера все равно нужно дальше гонять
так или иначе надо копировать из буфера в новый срез
источник

RS

Roman Sharkov in Go-go!
ziggy lucid
так мне значение из буфера все равно нужно дальше гонять
так или иначе надо копировать из буфера в новый срез
тут надо мерять, выявлять значимые тормоза и оптимизировать, в чём иногда вам может помочь sync.Pool
источник

zl

ziggy lucid in Go-go!
мне буфер, как райтер нужен по сути
не совсем очевидна выгода от хранения буферов в пуле, если все равно оттуда байты вытягивать в новый срез надо
источник