diff options
author | Brad Fitzpatrick <bradfitz@golang.org> | 2016-07-18 17:27:21 +0000 |
---|---|---|
committer | Brad Fitzpatrick <bradfitz@golang.org> | 2016-08-16 00:33:15 +0000 |
commit | 3ddc9ad9161c6d5ae07ce2304aa838d4b853cc78 (patch) | |
tree | 534f500ee713495ec133d7580886097bcadb6640 | |
parent | c88e868030f5f0bc68c11cb65af625e77acc43ba (diff) | |
download | go-3ddc9ad9161c6d5ae07ce2304aa838d4b853cc78.tar.gz go-3ddc9ad9161c6d5ae07ce2304aa838d4b853cc78.zip |
strings: add special cases for Join of 2 and 3 strings
We already had special cases for 0 and 1. Add 2 and 3 for now too.
To be removed if the compiler is improved later (#6714).
This halves the number of allocations and total bytes allocated via
common filepath.Join calls, improving filepath.Walk performance.
Noticed as part of investigating filepath.Walk in #16399.
Change-Id: If7b1bb85606d4720f3ebdf8de7b1e12ad165079d
Reviewed-on: https://go-review.googlesource.com/25005
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
-rw-r--r-- | src/strings/strings.go | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/strings/strings.go b/src/strings/strings.go index 919e8c8354..738c493032 100644 --- a/src/strings/strings.go +++ b/src/strings/strings.go @@ -342,11 +342,19 @@ func FieldsFunc(s string, f func(rune) bool) []string { // Join concatenates the elements of a to create a single string. The separator string // sep is placed between elements in the resulting string. func Join(a []string, sep string) string { - if len(a) == 0 { + switch len(a) { + case 0: return "" - } - if len(a) == 1 { + case 1: return a[0] + case 2: + // Special case for common small values. + // Remove if golang.org/issue/6714 is fixed + return a[0] + sep + a[1] + case 3: + // Special case for common small values. + // Remove if golang.org/issue/6714 is fixed + return a[0] + sep + a[1] + sep + a[2] } n := len(sep) * (len(a) - 1) for i := 0; i < len(a); i++ { |