Skip to content

Commit

Permalink
archive/tar: optimize formatPAXRecord() call
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
agnivade authored and dsnet committed Aug 12, 2017
1 parent 0d1a8f6 commit 23cd87e
Showing 1 changed file with 2 additions and 3 deletions.
5 changes: 2 additions & 3 deletions src/archive/tar/strconv.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ package tar

import (
"bytes"
"fmt"
"strconv"
"strings"
"time"
Expand Down Expand Up @@ -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
}
Expand Down

0 comments on commit 23cd87e

Please sign in to comment.