Util: Improve performance of strings.SplitString (#49115)

Replaces the regexp with calls to strings.ReplaceAll and strings.Fields
for simplicity and improved performance.

Signed-off-by: Dave Henderson <dave.henderson@grafana.com>
This commit is contained in:
Dave Henderson 2022-05-25 14:10:22 -07:00 committed by GitHub
parent 3ecee06630
commit 1f85101787
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 48 additions and 2 deletions

View File

@ -3,7 +3,6 @@ package util
import (
"fmt"
"math"
"regexp"
"strings"
"time"
"unicode"
@ -34,7 +33,7 @@ func SplitString(str string) []string {
return []string{}
}
return regexp.MustCompile("[, ]+").Split(str, -1)
return strings.Fields(strings.ReplaceAll(str, ",", " "))
}
// GetAgeString returns a string representing certain time from years to minutes.

View File

@ -58,6 +58,53 @@ func TestSplitString(t *testing.T) {
}
}
func BenchmarkSplitString(b *testing.B) {
b.Run("empty input", func(b *testing.B) {
for i := 0; i < b.N; i++ {
SplitString("")
}
})
b.Run("single string", func(b *testing.B) {
for i := 0; i < b.N; i++ {
SplitString("test")
}
})
b.Run("space-separated", func(b *testing.B) {
for i := 0; i < b.N; i++ {
SplitString("test1 test2 test3")
}
})
b.Run("comma-separated", func(b *testing.B) {
for i := 0; i < b.N; i++ {
SplitString("test1,test2,test3")
}
})
b.Run("comma-separated with spaces", func(b *testing.B) {
for i := 0; i < b.N; i++ {
SplitString("test1 , test2 test3")
}
})
b.Run("mixed commas and spaces", func(b *testing.B) {
for i := 0; i < b.N; i++ {
SplitString("test1 , test2 test3,test4")
}
})
b.Run("very long mixed", func(b *testing.B) {
for i := 0; i < b.N; i++ {
SplitString("test1 , test2 test3,test4, test5 test6 test7,test8 test9 test10" +
" test11 test12 test13,test14 test15 test16,test17 test18 test19,test20 test21 test22" +
" test23,test24 test25 test26,test27 test28 test29,test30 test31 test32" +
" test33,test34 test35 test36,test37 test38 test39,test40 test41 test42" +
" test43,test44 test45 test46,test47 test48 test49,test50 test51 test52" +
" test53,test54 test55 test56,test57 test58 test59,test60 test61 test62" +
" test63,test64 test65 test66,test67 test68 test69,test70 test71 test72" +
" test73,test74 test75 test76,test77 test78 test79,test80 test81 test82" +
" test83,test84 test85 test86,test87 test88 test89,test90 test91 test92" +
" test93,test94 test95 test96,test97 test98 test99,test100 ")
}
})
}
func TestDateAge(t *testing.T) {
assert.Equal(t, "?", GetAgeString(time.Time{})) // base case