1
0
mirror of https://github.com/golang/go synced 2024-11-17 17:54:48 -07:00

strings: optimize Replace by using a strings.Builder

name        old time/op    new time/op    delta
ReplaceAll     162ns ±26%     134ns ±26%  -17.44%  (p=0.014 n=10+10)

name        old alloc/op   new alloc/op   delta
ReplaceAll     32.0B ± 0%     16.0B ± 0%  -50.00%  (p=0.000 n=10+10)

name        old allocs/op  new allocs/op  delta
ReplaceAll      2.00 ± 0%      1.00 ± 0%  -50.00%  (p=0.000 n=10+10)

Change-Id: Ia8377141d3adb84c7bd94e511ac8f739915aeb40
Reviewed-on: https://go-review.googlesource.com/c/go/+/245197
Run-TryBot: Martin Möhrmann <moehrmann@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
Polina Osadcha 2020-06-18 16:17:13 +03:00 committed by Martin Möhrmann
parent 6f99b33c18
commit 51ac0f0f4c
2 changed files with 15 additions and 6 deletions

View File

@ -934,8 +934,8 @@ func Replace(s, old, new string, n int) string {
}
// Apply replacements to buffer.
t := make([]byte, len(s)+n*(len(new)-len(old)))
w := 0
var b Builder
b.Grow(len(s) + n*(len(new)-len(old)))
start := 0
for i := 0; i < n; i++ {
j := start
@ -947,12 +947,12 @@ func Replace(s, old, new string, n int) string {
} else {
j += Index(s[start:], old)
}
w += copy(t[w:], s[start:j])
w += copy(t[w:], new)
b.WriteString(s[start:j])
b.WriteString(new)
start = j + len(old)
}
w += copy(t[w:], s[start:])
return string(t[0:w])
b.WriteString(s[start:])
return b.String()
}
// ReplaceAll returns a copy of the string s with all

View File

@ -1900,3 +1900,12 @@ func BenchmarkTrimSpace(b *testing.B) {
})
}
}
var stringSink string
func BenchmarkReplaceAll(b *testing.B) {
b.ReportAllocs()
for i := 0; i < b.N; i++ {
stringSink = ReplaceAll("banana", "a", "<>")
}
}