archive/tar patches for performance
This commit is contained in:
parent
207296f435
commit
4086849026
64
go1.3-tar_reuse_buffer_readHeader.patch
Normal file
64
go1.3-tar_reuse_buffer_readHeader.patch
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# User Cristian Staretu <unclejacksons@gmail.com>
|
||||||
|
# Date 1404344479 -36000
|
||||||
|
# Thu Jul 03 09:41:19 2014 +1000
|
||||||
|
# Node ID 17404efd6b02d4b3acd17070e3f89de97a145877
|
||||||
|
# Parent 837348e418f33fc7a242f56dbe2feff829532526
|
||||||
|
archive/tar: reuse temporary buffer in readHeader
|
||||||
|
|
||||||
|
A temporary 512 bytes buffer is allocated for every call to
|
||||||
|
readHeader. This buffer isn't returned to the caller and it could
|
||||||
|
be reused to lower the number of memory allocations.
|
||||||
|
|
||||||
|
This CL improves it by using a pool and zeroing out the buffer before
|
||||||
|
putting it back into the pool.
|
||||||
|
|
||||||
|
benchmark old ns/op new ns/op delta
|
||||||
|
BenchmarkListFiles100k 545249903 538832687 -1.18%
|
||||||
|
|
||||||
|
benchmark old allocs new allocs delta
|
||||||
|
BenchmarkListFiles100k 2105167 2005692 -4.73%
|
||||||
|
|
||||||
|
benchmark old bytes new bytes delta
|
||||||
|
BenchmarkListFiles100k 105903472 54831527 -48.22%
|
||||||
|
|
||||||
|
This improvement is very important if your code has to deal with a lot
|
||||||
|
of tarballs which contain a lot of files.
|
||||||
|
|
||||||
|
LGTM=dsymonds
|
||||||
|
R=golang-codereviews, dave, dsymonds, bradfitz
|
||||||
|
CC=golang-codereviews
|
||||||
|
https://codereview.appspot.com/108240044
|
||||||
|
|
||||||
|
Committer: David Symonds <dsymonds@golang.org>
|
||||||
|
|
||||||
|
diff -r 837348e418f3 -r 17404efd6b02 src/pkg/archive/tar/reader.go
|
||||||
|
--- a/src/pkg/archive/tar/reader.go Thu Jul 03 09:40:53 2014 +1000
|
||||||
|
+++ b/src/pkg/archive/tar/reader.go Thu Jul 03 09:41:19 2014 +1000
|
||||||
|
@@ -29,10 +29,11 @@
|
||||||
|
// The Next method advances to the next file in the archive (including the first),
|
||||||
|
// and then it can be treated as an io.Reader to access the file's data.
|
||||||
|
type Reader struct {
|
||||||
|
- r io.Reader
|
||||||
|
- err error
|
||||||
|
- pad int64 // amount of padding (ignored) after current file entry
|
||||||
|
- curr numBytesReader // reader for current file entry
|
||||||
|
+ r io.Reader
|
||||||
|
+ err error
|
||||||
|
+ pad int64 // amount of padding (ignored) after current file entry
|
||||||
|
+ curr numBytesReader // reader for current file entry
|
||||||
|
+ hdrBuff [blockSize]byte // buffer to use in readHeader
|
||||||
|
}
|
||||||
|
|
||||||
|
// A numBytesReader is an io.Reader with a numBytes method, returning the number
|
||||||
|
@@ -426,7 +427,9 @@
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tr *Reader) readHeader() *Header {
|
||||||
|
- header := make([]byte, blockSize)
|
||||||
|
+ header := tr.hdrBuff[:]
|
||||||
|
+ copy(header, zeroBlock)
|
||||||
|
+
|
||||||
|
if _, tr.err = io.ReadFull(tr.r, header); tr.err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
56
go1.3-tar_reuse_buffer_writeHeader.patch
Normal file
56
go1.3-tar_reuse_buffer_writeHeader.patch
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# User Cristian Staretu <unclejacksons@gmail.com>
|
||||||
|
# Date 1404344453 -36000
|
||||||
|
# Thu Jul 03 09:40:53 2014 +1000
|
||||||
|
# Node ID 837348e418f33fc7a242f56dbe2feff829532526
|
||||||
|
# Parent c5f72a685e256457a0872f6587e2bb9500eac7c4
|
||||||
|
archive/tar: reuse temporary buffer in writeHeader
|
||||||
|
|
||||||
|
A temporary 512 bytes buffer is allocated for every call to
|
||||||
|
writeHeader. This buffer could be reused the lower the number
|
||||||
|
of memory allocations.
|
||||||
|
|
||||||
|
benchmark old ns/op new ns/op delta
|
||||||
|
BenchmarkWriteFiles100k 634622051 583810847 -8.01%
|
||||||
|
|
||||||
|
benchmark old allocs new allocs delta
|
||||||
|
BenchmarkWriteFiles100k 2701920 2602621 -3.68%
|
||||||
|
|
||||||
|
benchmark old bytes new bytes delta
|
||||||
|
BenchmarkWriteFiles100k 115383884 64349922 -44.23%
|
||||||
|
|
||||||
|
This change is very important if your code has to write a lot of
|
||||||
|
tarballs with a lot of files.
|
||||||
|
|
||||||
|
LGTM=dsymonds
|
||||||
|
R=golang-codereviews, dave, dsymonds
|
||||||
|
CC=golang-codereviews
|
||||||
|
https://codereview.appspot.com/107440043
|
||||||
|
|
||||||
|
Committer: David Symonds <dsymonds@golang.org>
|
||||||
|
|
||||||
|
diff -r c5f72a685e25 -r 837348e418f3 src/pkg/archive/tar/writer.go
|
||||||
|
--- a/src/pkg/archive/tar/writer.go Wed Jul 02 15:28:57 2014 -0700
|
||||||
|
+++ b/src/pkg/archive/tar/writer.go Thu Jul 03 09:40:53 2014 +1000
|
||||||
|
@@ -37,8 +37,9 @@
|
||||||
|
nb int64 // number of unwritten bytes for current file entry
|
||||||
|
pad int64 // amount of padding to write after current file entry
|
||||||
|
closed bool
|
||||||
|
- usedBinary bool // whether the binary numeric field extension was used
|
||||||
|
- preferPax bool // use pax header instead of binary numeric header
|
||||||
|
+ usedBinary bool // whether the binary numeric field extension was used
|
||||||
|
+ preferPax bool // use pax header instead of binary numeric header
|
||||||
|
+ hdrBuff [blockSize]byte // buffer to use in writeHeader
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewWriter creates a new Writer writing to w.
|
||||||
|
@@ -160,7 +161,8 @@
|
||||||
|
// subsecond time resolution, but for now let's just capture
|
||||||
|
// too long fields or non ascii characters
|
||||||
|
|
||||||
|
- header := make([]byte, blockSize)
|
||||||
|
+ header := tw.hdrBuff[:]
|
||||||
|
+ copy(header, zeroBlock)
|
||||||
|
s := slicer(header)
|
||||||
|
|
||||||
|
// keep a reference to the filename to allow to overwrite it later if we detect that we can use ustar longnames instead of pax
|
14
golang.spec
14
golang.spec
@ -39,7 +39,7 @@
|
|||||||
|
|
||||||
Name: golang
|
Name: golang
|
||||||
Version: 1.3
|
Version: 1.3
|
||||||
Release: 1%{?dist}
|
Release: 2%{?dist}
|
||||||
Summary: The Go Programming Language
|
Summary: The Go Programming Language
|
||||||
|
|
||||||
License: BSD
|
License: BSD
|
||||||
@ -73,6 +73,11 @@ Patch1: golang-1.2-remove-ECC-p224.patch
|
|||||||
# http://code.google.com/p/go/issues/detail?id=6522
|
# http://code.google.com/p/go/issues/detail?id=6522
|
||||||
Patch2: ./golang-1.2-skipCpuProfileTest.patch
|
Patch2: ./golang-1.2-skipCpuProfileTest.patch
|
||||||
|
|
||||||
|
# these patches can be dropped for go1.4
|
||||||
|
# discovered working here https://github.com/dotcloud/docker/pull/6829
|
||||||
|
Patch3: ./go1.3-tar_reuse_buffer_readHeader.patch
|
||||||
|
Patch4: ./go1.3-tar_reuse_buffer_writeHeader.patch
|
||||||
|
|
||||||
# Having documentation separate was broken
|
# Having documentation separate was broken
|
||||||
Obsoletes: %{name}-docs < 1.1-4
|
Obsoletes: %{name}-docs < 1.1-4
|
||||||
|
|
||||||
@ -357,6 +362,10 @@ end
|
|||||||
# skip flaky test
|
# skip flaky test
|
||||||
%patch2 -p1
|
%patch2 -p1
|
||||||
|
|
||||||
|
# performance for archive/tar
|
||||||
|
%patch3 -p1
|
||||||
|
%patch4 -p1
|
||||||
|
|
||||||
# create a [dirty] gcc wrapper to allow us to build with our own flags
|
# create a [dirty] gcc wrapper to allow us to build with our own flags
|
||||||
# (dirty because it is spoofing 'gcc' since CC value is stored in the go tool)
|
# (dirty because it is spoofing 'gcc' since CC value is stored in the go tool)
|
||||||
# TODO: remove this and just set CFLAGS/LDFLAGS once upstream supports it
|
# TODO: remove this and just set CFLAGS/LDFLAGS once upstream supports it
|
||||||
@ -973,6 +982,9 @@ GOROOT=%{goroot} GOOS=openbsd GOARCH=amd64 go install std
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Jul 07 2014 Vincent Batts <vbatts@fedoraproejct.org> - 1.3-2
|
||||||
|
- archive/tar memory allocation improvements
|
||||||
|
|
||||||
* Thu Jun 19 2014 Vincent Batts <vbatts@fedoraproejct.org> - 1.3-1
|
* Thu Jun 19 2014 Vincent Batts <vbatts@fedoraproejct.org> - 1.3-1
|
||||||
- update to go1.3
|
- update to go1.3
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user