]> Cypherpunks repositories - gostls13.git/commitdiff
archive/zip: pool flate readers
authorNiko Dziemba <niko@dziemba.com>
Wed, 10 Feb 2016 14:57:16 +0000 (15:57 +0100)
committerBrad Fitzpatrick <bradfitz@golang.org>
Wed, 4 May 2016 14:28:27 +0000 (14:28 +0000)
Similar to the flate Writer pools already used,
this adds pooling for flate Readers.

compress/flate allows re-using of Readers, see
https://codereview.appspot.com/97140043/

In a real-world scenario when reading ~ 500 small files from a ZIP
archive this gives a speedup of 1.5x-2x.

Fixes #14289

Change-Id: I2d98ad983e95ab7d97e06fd0145f619b4f47caa4
Reviewed-on: https://go-review.googlesource.com/19416
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/archive/zip/register.go

index 8fccbf7ca09992e0188e5cf21e98bc173376a4c6..2e76386b1fdbe5b5492f676c67bfc863ac9f85be 100644 (file)
@@ -64,6 +64,44 @@ func (w *pooledFlateWriter) Close() error {
        return err
 }
 
+var flateReaderPool sync.Pool
+
+func newFlateReader(r io.Reader) io.ReadCloser {
+       fr, ok := flateReaderPool.Get().(io.ReadCloser)
+       if ok {
+               fr.(flate.Resetter).Reset(r, nil)
+       } else {
+               fr = flate.NewReader(r)
+       }
+       return &pooledFlateReader{fr: fr}
+}
+
+type pooledFlateReader struct {
+       mu sync.Mutex // guards Close and Read
+       fr io.ReadCloser
+}
+
+func (r *pooledFlateReader) Read(p []byte) (n int, err error) {
+       r.mu.Lock()
+       defer r.mu.Unlock()
+       if r.fr == nil {
+               return 0, errors.New("Read after Close")
+       }
+       return r.fr.Read(p)
+}
+
+func (r *pooledFlateReader) Close() error {
+       r.mu.Lock()
+       defer r.mu.Unlock()
+       var err error
+       if r.fr != nil {
+               err = r.fr.Close()
+               flateReaderPool.Put(r.fr)
+               r.fr = nil
+       }
+       return err
+}
+
 var (
        mu sync.RWMutex // guards compressor and decompressor maps
 
@@ -74,7 +112,7 @@ var (
 
        decompressors = map[uint16]Decompressor{
                Store:   ioutil.NopCloser,
-               Deflate: flate.NewReader,
+               Deflate: newFlateReader,
        }
 )