From: Agniva De Sarker Date: Fri, 11 Aug 2017 19:23:45 +0000 (+0530) Subject: archive/tar: optimize formatPAXRecord() call X-Git-Tag: go1.10beta1~1631 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=23cd87eb0a2d49a3208824feaf34d8b852da422f;p=gostls13.git archive/tar: optimize formatPAXRecord() call By replacing fmt.Sprintf with a simple string concat, we see pretty good improvements across the board on time and memory. name old time/op new time/op delta FormatPAXRecord 683ns ± 2% 210ns ± 5% -69.22% (p=0.000 n=10+10) name old alloc/op new alloc/op delta FormatPAXRecord 112B ± 0% 32B ± 0% -71.43% (p=0.000 n=10+10) name old allocs/op new allocs/op delta FormatPAXRecord 8.00 ± 0% 2.00 ± 0% -75.00% (p=0.000 n=10+10) Ran with - -cpu=1 -count=10 on an AMD64 i5-5200U CPU @ 2.20GHz Using the following benchmark: func BenchmarkFormatPAXRecord(b *testing.B) { for n := 0; n < b.N; n++ { formatPAXRecord("foo", "bar") } } Change-Id: I828ddbafad2e5d937f0cf5f777b512638344acfc Reviewed-on: https://go-review.googlesource.com/55210 Reviewed-by: Joe Tsai --- diff --git a/src/archive/tar/strconv.go b/src/archive/tar/strconv.go index 7629c43c65..929770c25c 100644 --- a/src/archive/tar/strconv.go +++ b/src/archive/tar/strconv.go @@ -6,7 +6,6 @@ package tar import ( "bytes" - "fmt" "strconv" "strings" "time" @@ -266,12 +265,12 @@ func formatPAXRecord(k, v string) (string, error) { const padding = 3 // Extra padding for ' ', '=', and '\n' size := len(k) + len(v) + padding size += len(strconv.Itoa(size)) - record := fmt.Sprintf("%d %s=%s\n", size, k, v) + record := strconv.Itoa(size) + " " + k + "=" + v + "\n" // Final adjustment if adding size field increased the record size. if len(record) != size { size = len(record) - record = fmt.Sprintf("%d %s=%s\n", size, k, v) + record = strconv.Itoa(size) + " " + k + "=" + v + "\n" } return record, nil }