aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/bytes/bytes.go
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2014-06-11 19:03:59 -0700
committerJosh Bleecher Snyder <josharian@gmail.com>2014-06-11 19:03:59 -0700
commit7bcbb65d7879f17b185cee9ab4ab392da0bd865f (patch)
tree32e2589bcc426a1be9cf56e0f4fa5b1738a129b1 /src/pkg/bytes/bytes.go
parent22a5d2cc961a0f115ebd61f41cabec6e668ed451 (diff)
downloadgo-7bcbb65d7879f17b185cee9ab4ab392da0bd865f.tar.xz
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
Diffstat (limited to 'src/pkg/bytes/bytes.go')
-rw-r--r--src/pkg/bytes/bytes.go7
1 files changed, 4 insertions, 3 deletions
diff --git a/src/pkg/bytes/bytes.go b/src/pkg/bytes/bytes.go
index 0c53e4c0b7..d8b6f998b3 100644
--- a/src/pkg/bytes/bytes.go
+++ b/src/pkg/bytes/bytes.go
@@ -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
}