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
 // 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
 }
 
                TrimSpace(s)
        }
 }
+
+func BenchmarkRepeat(b *testing.B) {
+       for i := 0; i < b.N; i++ {
+               Repeat([]byte("-"), 80)
+       }
+}
 
 // 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)
 }
 
                Split(benchInputHard, "hello")
        }
 }
+
+func BenchmarkRepeat(b *testing.B) {
+       for i := 0; i < b.N; i++ {
+               Repeat("-", 80)
+       }
+}