diff options
author | Miguel Molina <miguel@erizocosmi.co> | 2017-09-04 18:23:26 +0200 |
---|---|---|
committer | Miguel Molina <miguel@erizocosmi.co> | 2017-09-04 18:23:26 +0200 |
commit | 6a46a7eb543789c7012bf0f964e1b6b38eca150c (patch) | |
tree | 13283ed091249f601ceacd7c64a3467c5f4eac78 /plumbing | |
parent | 770800d980ba7e0af40502324d15ed50445a3291 (diff) | |
download | go-git-6a46a7eb543789c7012bf0f964e1b6b38eca150c.tar.gz |
packfile: improve performance a little by reducing gc pressure
Signed-off-by: Miguel Molina <miguel@erizocosmi.co>
Diffstat (limited to 'plumbing')
-rw-r--r-- | plumbing/format/packfile/common.go | 8 | ||||
-rw-r--r-- | plumbing/format/packfile/decoder.go | 4 | ||||
-rw-r--r-- | plumbing/format/packfile/diff_delta.go | 12 | ||||
-rw-r--r-- | plumbing/format/packfile/scanner.go | 15 |
4 files changed, 33 insertions, 6 deletions
diff --git a/plumbing/format/packfile/common.go b/plumbing/format/packfile/common.go index 728cb16..7dad1f6 100644 --- a/plumbing/format/packfile/common.go +++ b/plumbing/format/packfile/common.go @@ -1,7 +1,9 @@ package packfile import ( + "bytes" "io" + "sync" "gopkg.in/src-d/go-git.v4/plumbing/storer" "gopkg.in/src-d/go-git.v4/utils/ioutil" @@ -49,3 +51,9 @@ func writePackfileToObjectStorage(sw storer.PackfileWriter, packfile io.Reader) _, err = io.Copy(w, packfile) return err } + +var bufPool = sync.Pool{ + New: func() interface{} { + return bytes.NewBuffer(nil) + }, +} diff --git a/plumbing/format/packfile/decoder.go b/plumbing/format/packfile/decoder.go index e49de51..3d475b2 100644 --- a/plumbing/format/packfile/decoder.go +++ b/plumbing/format/packfile/decoder.go @@ -347,7 +347,8 @@ func (d *Decoder) fillRegularObjectContent(obj plumbing.EncodedObject) (uint32, } func (d *Decoder) fillREFDeltaObjectContent(obj plumbing.EncodedObject, ref plumbing.Hash) (uint32, error) { - buf := bytes.NewBuffer(nil) + buf := bufPool.Get().(*bytes.Buffer) + buf.Reset() _, crc, err := d.s.NextObject(buf) if err != nil { return 0, err @@ -364,6 +365,7 @@ func (d *Decoder) fillREFDeltaObjectContent(obj plumbing.EncodedObject, ref plum obj.SetType(base.Type()) err = ApplyDelta(obj, base, buf.Bytes()) d.cachePut(obj) + bufPool.Put(buf) return crc, err } diff --git a/plumbing/format/packfile/diff_delta.go b/plumbing/format/packfile/diff_delta.go index 60a04d9..7e9f822 100644 --- a/plumbing/format/packfile/diff_delta.go +++ b/plumbing/format/packfile/diff_delta.go @@ -60,13 +60,15 @@ func GetDelta(base, target plumbing.EncodedObject) (plumbing.EncodedObject, erro // DiffDelta returns the delta that transforms src into tgt. func DiffDelta(src []byte, tgt []byte) []byte { - buf := bytes.NewBuffer(nil) + buf := bufPool.Get().(*bytes.Buffer) + buf.Reset() buf.Write(deltaEncodeSize(len(src))) buf.Write(deltaEncodeSize(len(tgt))) sindex := initMatch(src) - ibuf := bytes.NewBuffer(nil) + ibuf := bufPool.Get().(*bytes.Buffer) + ibuf.Reset() for i := 0; i < len(tgt); i++ { offset, l := findMatch(src, tgt, sindex, i) @@ -93,8 +95,12 @@ func DiffDelta(src []byte, tgt []byte) []byte { } encodeInsertOperation(ibuf, buf) + bytes := buf.Bytes() + + bufPool.Put(buf) + bufPool.Put(ibuf) - return buf.Bytes() + return bytes } func encodeInsertOperation(ibuf, buf *bytes.Buffer) { diff --git a/plumbing/format/packfile/scanner.go b/plumbing/format/packfile/scanner.go index 1dab2f2..d2d776f 100644 --- a/plumbing/format/packfile/scanner.go +++ b/plumbing/format/packfile/scanner.go @@ -9,6 +9,7 @@ import ( "hash/crc32" "io" stdioutil "io/ioutil" + "sync" "gopkg.in/src-d/go-git.v4/plumbing" "gopkg.in/src-d/go-git.v4/utils/binary" @@ -291,10 +292,18 @@ func (s *Scanner) copyObject(w io.Writer) (n int64, err error) { } defer ioutil.CheckClose(s.zr, &err) - n, err = io.Copy(w, s.zr) + buf := byteSlicePool.Get().([]byte) + n, err = io.CopyBuffer(w, s.zr, buf) + byteSlicePool.Put(buf) return } +var byteSlicePool = sync.Pool{ + New: func() interface{} { + return make([]byte, 32*1024) + }, +} + // SeekFromStart sets a new offset from start, returns the old position before // the change. func (s *Scanner) SeekFromStart(offset int64) (previous int64, err error) { @@ -324,7 +333,9 @@ func (s *Scanner) Checksum() (plumbing.Hash, error) { // Close reads the reader until io.EOF func (s *Scanner) Close() error { - _, err := io.Copy(stdioutil.Discard, s.r) + buf := byteSlicePool.Get().([]byte) + _, err := io.CopyBuffer(stdioutil.Discard, s.r, buf) + byteSlicePool.Put(buf) return err } |