mirror of
https://github.com/golang/go.git
synced 2024-09-22 10:58:58 +00:00
bytes, strings: optimize Repeat
Call copy with as large buffer as possible to reduce the number of function calls. benchmark old ns/op new ns/op delta BenchmarkBytesRepeat 540 162 -70.00% BenchmarkStringsRepeat 563 177 -68.56% LGTM=josharian R=golang-codereviews, josharian, dave, dvyukov CC=golang-codereviews https://golang.org/cl/90550043
This commit is contained in:
parent
22a5d2cc96
commit
7bcbb65d78
@ -377,9 +377,10 @@ func Map(mapping func(r rune) rune, s []byte) []byte {
|
||||
// Repeat returns a new byte slice consisting of count copies of b.
|
||||
func Repeat(b []byte, count int) []byte {
|
||||
nb := make([]byte, len(b)*count)
|
||||
bp := 0
|
||||
for i := 0; i < count; i++ {
|
||||
bp += copy(nb[bp:], b)
|
||||
bp := copy(nb, b)
|
||||
for bp < len(nb) {
|
||||
copy(nb[bp:], nb[:bp])
|
||||
bp *= 2
|
||||
}
|
||||
return nb
|
||||
}
|
||||
|
@ -1232,3 +1232,9 @@ func BenchmarkTrimSpace(b *testing.B) {
|
||||
TrimSpace(s)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkRepeat(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
Repeat([]byte("-"), 80)
|
||||
}
|
||||
}
|
||||
|
@ -423,9 +423,10 @@ func Map(mapping func(rune) rune, s string) string {
|
||||
// Repeat returns a new string consisting of count copies of the string s.
|
||||
func Repeat(s string, count int) string {
|
||||
b := make([]byte, len(s)*count)
|
||||
bp := 0
|
||||
for i := 0; i < count; i++ {
|
||||
bp += copy(b[bp:], s)
|
||||
bp := copy(b, s)
|
||||
for bp < len(b) {
|
||||
copy(b[bp:], b[:bp])
|
||||
bp *= 2
|
||||
}
|
||||
return string(b)
|
||||
}
|
||||
|
@ -1174,3 +1174,9 @@ func BenchmarkSplit3(b *testing.B) {
|
||||
Split(benchInputHard, "hello")
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkRepeat(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
Repeat("-", 80)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user