Add FlateDefault option and improve zstd allocs

This commit is contained in:
Nicolás Pazos 2023-11-03 12:00:59 -03:00 committed by Callum Styan
parent 7740f35338
commit c62a862aa6

View file

@ -35,6 +35,7 @@ const (
ZstdBestComp ZstdBestComp
Lzw Lzw
FlateFast FlateFast
FlateDefault
FlateComp FlateComp
BrotliFast BrotliFast
BrotliComp BrotliComp
@ -76,6 +77,8 @@ var createComp func() Compression = func() Compression {
return &flateCompression{level: flate.BestSpeed} return &flateCompression{level: flate.BestSpeed}
case FlateComp: case FlateComp:
return &flateCompression{level: flate.BestCompression} return &flateCompression{level: flate.BestCompression}
case FlateDefault:
return &flateCompression{level: flate.DefaultCompression}
case BrotliFast: case BrotliFast:
return &brotliCompression{quality: brotli.BestSpeed} return &brotliCompression{quality: brotli.BestSpeed}
case BrotliDefault: case BrotliDefault:
@ -162,7 +165,7 @@ func (s *s2Compression) Decompress(data []byte) ([]byte, error) {
type zstdCompression struct { type zstdCompression struct {
level zstd.EncoderLevel level zstd.EncoderLevel
buf []byte buf bytes.Buffer
r *reZstd.Decoder r *reZstd.Decoder
w *reZstd.Encoder w *reZstd.Encoder
} }
@ -175,14 +178,18 @@ func (z *zstdCompression) Compress(data []byte) ([]byte, error) {
return nil, err return nil, err
} }
} }
z.w.Reset(nil)
z.buf = z.buf[:0] z.buf.Reset()
res := z.w.EncodeAll(data, z.buf) z.w.Reset(&z.buf)
if len(res) > cap(z.buf) { _, err = z.w.Write(data)
z.buf = res if err != nil {
return nil, err
} }
return res, nil err = z.w.Close()
if err != nil {
return nil, err
}
return z.buf.Bytes(), nil
} }
func (z *zstdCompression) Decompress(data []byte) ([]byte, error) { func (z *zstdCompression) Decompress(data []byte) ([]byte, error) {
@ -193,20 +200,17 @@ func (z *zstdCompression) Decompress(data []byte) ([]byte, error) {
return nil, err return nil, err
} }
} }
err = z.r.Reset(nil)
if err != nil {
return nil, err
}
z.buf = z.buf[:0] err = z.r.Reset(bytes.NewReader(data))
buf, err := z.r.DecodeAll(data, z.buf)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if len(buf) > cap(z.buf) { z.buf.Reset()
z.buf = buf _, err = io.Copy(&z.buf, z.r)
if err != nil {
return nil, err
} }
return buf, nil return z.buf.Bytes(), nil
} }
type lzwCompression struct { type lzwCompression struct {