]> Cypherpunks repositories - gostls13.git/commitdiff
strings: reuse the input string for Repeat count of 1
authorAnuraag Agrawal <anuraaga@gmail.com>
Fri, 10 Jun 2022 05:41:02 +0000 (05:41 +0000)
committerGopher Robot <gobot@golang.org>
Wed, 14 Sep 2022 14:56:07 +0000 (14:56 +0000)
The existing implementation allocates a new string even when the
count is 1, where we know the output is the same as the input.
While we wouldn't expect a count of 1 for hardcoded values of the
parameter, it is expected when the parameter is computed based on
a different value (e.g., the length of a input slice).

name            old time/op  new time/op  delta
Repeat/5x0-10   2.03ns ± 0%  2.02ns ± 0%   ~     (p=1.000 n=1+1)
Repeat/5x1-10   13.7ns ± 0%   2.0ns ± 0%   ~     (p=1.000 n=1+1)
Repeat/5x2-10   18.2ns ± 0%  18.1ns ± 0%   ~     (p=1.000 n=1+1)
Repeat/5x6-10   27.0ns ± 0%  27.0ns ± 0%   ~     (p=1.000 n=1+1)
Repeat/10x0-10  2.02ns ± 0%  2.02ns ± 0%   ~     (p=1.000 n=1+1)
Repeat/10x1-10  16.1ns ± 0%   2.0ns ± 0%   ~     (p=1.000 n=1+1)
Repeat/10x2-10  20.8ns ± 0%  20.9ns ± 0%   ~     (p=1.000 n=1+1)
Repeat/10x6-10  29.2ns ± 0%  29.4ns ± 0%   ~     (p=1.000 n=1+1)

Change-Id: I48e08e08f8f6d6914d62b3d6a61d563d637bec59
GitHub-Last-Rev: 068f58e08b8f5c4105e7a210f242ca1ff3a61177
GitHub-Pull-Request: golang/go#53321
Reviewed-on: https://go-review.googlesource.com/c/go/+/411477
Reviewed-by: Ian Lance Taylor <iant@google.com>
Run-TryBot: Ian Lance Taylor <iant@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Auto-Submit: Ian Lance Taylor <iant@google.com>
Reviewed-by: Keith Randall <khr@google.com>
src/strings/strings.go
src/strings/strings_test.go

index 1e8de2bc34cacb5af1913a60324f36369eeef340..7cf36865694bdd4afc7a5ec7f31d66f01d018fe6 100644 (file)
@@ -523,8 +523,11 @@ func Map(mapping func(rune) rune, s string) string {
 // It panics if count is negative or if
 // the result of (len(s) * count) overflows.
 func Repeat(s string, count int) string {
-       if count == 0 {
+       switch count {
+       case 0:
                return ""
+       case 1:
+               return s
        }
 
        // Since we cannot return an error on overflow,
index 8af81a556bf476f87fd2c15fdb779ebe82f85ecd..9323ff988d60a88592c6a6f4582da9494322031f 100644 (file)
@@ -1852,7 +1852,7 @@ func BenchmarkSplitNMultiByteSeparator(b *testing.B) {
 func BenchmarkRepeat(b *testing.B) {
        s := "0123456789"
        for _, n := range []int{5, 10} {
-               for _, c := range []int{1, 2, 6} {
+               for _, c := range []int{0, 1, 2, 6} {
                        b.Run(fmt.Sprintf("%dx%d", n, c), func(b *testing.B) {
                                for i := 0; i < b.N; i++ {
                                        Repeat(s[:n], c)