mirror of
https://github.com/golang/go
synced 2024-11-12 09:30:25 -07:00
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://golang.org/cl/107440043
This commit is contained in:
parent
372f399e00
commit
fe5a358aae
@ -37,8 +37,9 @@ type Writer struct {
|
||||
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 @@ func (tw *Writer) writeHeader(hdr *Header, allowPax bool) error {
|
||||
// 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
|
||||
|
Loading…
Reference in New Issue
Block a user