diff options
author | Agniva De Sarker <agnivade@yahoo.co.in> | 2017-09-28 15:07:48 +0530 |
---|---|---|
committer | Ilya Tocar <ilya.tocar@intel.com> | 2017-11-07 18:44:50 +0000 |
commit | 13cfb15cb18a8c0c31212c302175a4cb4c050155 (patch) | |
tree | 58132ab25dbe25093c8c2c849dd2de61d369b491 /src/strings/strings_test.go | |
parent | f10d99f51da73721dd0b9ab1c03c4a868a991756 (diff) | |
download | go-git-13cfb15cb18a8c0c31212c302175a4cb4c050155.tar.gz |
strings: optimize ToUpper
Handling the ASCII case inline and call unicode.ToUpper only
for non-ascii cases.
Gives good improvements for the ascii case and minor perf
degrade for non-ascii case
name old time/op new time/op delta
ToUpper/#00 11.7ns ± 8% 8.0ns ± 1% -31.95% (p=0.008 n=5+5)
ToUpper/ONLYUPPER 45.6ns ± 5% 19.9ns ± 1% -56.40% (p=0.008 n=5+5)
ToUpper/abc 77.4ns ± 1% 57.0ns ± 1% -26.32% (p=0.008 n=5+5)
ToUpper/AbC123 92.1ns ± 4% 67.7ns ± 2% -26.57% (p=0.008 n=5+5)
ToUpper/azAZ09_ 105ns ± 6% 67ns ± 2% -36.26% (p=0.000 n=5+4)
ToUpper/longStrinGwitHmixofsmaLLandcAps 255ns ± 1% 140ns ± 1% -45.01% (p=0.029 n=4+4)
ToUpper/longɐstringɐwithɐnonasciiⱯchars 440ns ± 1% 447ns ± 0% +1.49% (p=0.016 n=5+4)
ToUpper/ɐɐɐɐɐ 370ns ± 4% 366ns ± 1% ~ (p=0.667 n=5+5)
name old alloc/op new alloc/op delta
ToUpper/#00 0.00B 0.00B ~ (all equal)
ToUpper/ONLYUPPER 0.00B 0.00B ~ (all equal)
ToUpper/abc 16.0B ± 0% 6.0B ± 0% -62.50% (p=0.008 n=5+5)
ToUpper/AbC123 16.0B ± 0% 16.0B ± 0% ~ (all equal)
ToUpper/azAZ09_ 24.0B ± 0% 16.0B ± 0% -33.33% (p=0.008 n=5+5)
ToUpper/longStrinGwitHmixofsmaLLandcAps 80.0B ± 0% 64.0B ± 0% -20.00% (p=0.008 n=5+5)
ToUpper/longɐstringɐwithɐnonasciiⱯchars 96.0B ± 0% 96.0B ± 0% ~ (all equal)
ToUpper/ɐɐɐɐɐ 64.0B ± 0% 64.0B ± 0% ~ (all equal)
Ran on a machine with Intel(R) Core(TM) i5-5200U CPU @ 2.20GHz
Updates #17859
Change-Id: I0735ac4a4a36e8a8f6cc06f2c16b871f12b4abf9
Reviewed-on: https://go-review.googlesource.com/68370
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Joe Tsai <thebrokentoaster@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/strings/strings_test.go')
-rw-r--r-- | src/strings/strings_test.go | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/strings/strings_test.go b/src/strings/strings_test.go index 869be9c477..b185e7eec8 100644 --- a/src/strings/strings_test.go +++ b/src/strings/strings_test.go @@ -518,9 +518,12 @@ func runStringTests(t *testing.T, f func(string) string, funcName string, testCa var upperTests = []StringTest{ {"", ""}, + {"ONLYUPPER", "ONLYUPPER"}, {"abc", "ABC"}, {"AbC123", "ABC123"}, {"azAZ09_", "AZAZ09_"}, + {"longStrinGwitHmixofsmaLLandcAps", "LONGSTRINGWITHMIXOFSMALLANDCAPS"}, + {"long\u0250string\u0250with\u0250nonascii\u2C6Fchars", "LONG\u2C6FSTRING\u2C6FWITH\u2C6FNONASCII\u2C6FCHARS"}, {"\u0250\u0250\u0250\u0250\u0250", "\u2C6F\u2C6F\u2C6F\u2C6F\u2C6F"}, // grows one byte per char } @@ -648,6 +651,19 @@ func TestToUpper(t *testing.T) { runStringTests(t, ToUpper, "ToUpper", upperTest func TestToLower(t *testing.T) { runStringTests(t, ToLower, "ToLower", lowerTests) } +func BenchmarkToUpper(b *testing.B) { + for _, tc := range upperTests { + b.Run(tc.in, func(b *testing.B) { + for i := 0; i < b.N; i++ { + actual := ToUpper(tc.in) + if actual != tc.out { + b.Errorf("ToUpper(%q) = %q; want %q", tc.in, actual, tc.out) + } + } + }) + } +} + func BenchmarkMapNoChanges(b *testing.B) { identity := func(r rune) rune { return r |