From: Ewan Chou Date: Wed, 6 Mar 2013 20:21:19 +0000 (-0500) Subject: strings: remove allocations in Split(s, "") X-Git-Tag: go1.1rc2~669 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=4f43201e51f36e7db909ff3c3a86104dada5161b;p=gostls13.git strings: remove allocations in Split(s, "") BenchmarkSplit1 77984460 24131380 -69.06% R=golang-dev, rsc, minux.ma, dave, extemporalgenome CC=golang-dev https://golang.org/cl/7458043 --- diff --git a/src/pkg/strings/strings.go b/src/pkg/strings/strings.go index ccf415e694..263fa02bab 100644 --- a/src/pkg/strings/strings.go +++ b/src/pkg/strings/strings.go @@ -26,7 +26,11 @@ func explode(s string, n int) []string { i, cur := 0, 0 for ; i+1 < n; i++ { ch, size = utf8.DecodeRuneInString(s[cur:]) - a[i] = string(ch) + if ch == utf8.RuneError { + a[i] = string(utf8.RuneError) + } else { + a[i] = s[cur : cur+size] + } cur += size } // add the rest, if there is any diff --git a/src/pkg/strings/strings_test.go b/src/pkg/strings/strings_test.go index 09de49e5fb..68b658ca46 100644 --- a/src/pkg/strings/strings_test.go +++ b/src/pkg/strings/strings_test.go @@ -1095,3 +1095,21 @@ func BenchmarkFieldsFunc(b *testing.B) { FieldsFunc(fieldsInput, unicode.IsSpace) } } + +func BenchmarkSplit1(b *testing.B) { + for i := 0; i < b.N; i++ { + Split(benchInputHard, "") + } +} + +func BenchmarkSplit2(b *testing.B) { + for i := 0; i < b.N; i++ { + Split(benchInputHard, "/") + } +} + +func BenchmarkSplit3(b *testing.B) { + for i := 0; i < b.N; i++ { + Split(benchInputHard, "hello") + } +}