]> Cypherpunks repositories - gostls13.git/commitdiff
unicode/utf8: optimize ValidRune
authorJoe Tsai <joetsai@digital-static.net>
Wed, 26 Oct 2016 21:31:48 +0000 (14:31 -0700)
committerJoe Tsai <thebrokentoaster@gmail.com>
Wed, 26 Oct 2016 23:02:52 +0000 (23:02 +0000)
Re-writing the switch statement as a single boolean expression
reduces the number of branches that the compiler generates.
It is also arguably easier to read as a pair of numeric ranges
that valid runes can exist in.

No test changes since the existing test does a good job of
testing all of the boundaries.

This change was to gain back some performance after a correctness
fix done in http://golang.org/cl/32123.

The correctness fix (CL/32123) slowed down the benchmarks slightly:
benchmark                   old ns/op     new ns/op     delta
BenchmarkIndexRune/10-4     19.3          21.6          +11.92%
BenchmarkIndexRune/32-4     33.6          35.2          +4.76%

Since the fix relies on utf8.ValidRune, this CL improves benchmarks:
benchmark                   old ns/op     new ns/op     delta
BenchmarkIndexRune/10-4     21.6          20.0          -7.41%
BenchmarkIndexRune/32-4     35.2          33.5          -4.83%

Change-Id: Ib1ca10a2e29c90e879a8ef9b7221c33e85d015d8
Reviewed-on: https://go-review.googlesource.com/32122
Run-TryBot: Joe Tsai <thebrokentoaster@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/unicode/utf8/utf8.go

index 2ff79f66835d9af71113140e1d5901da5a1f5361..6ccd46437382bf8322c8cf99153a9341670d4535 100644 (file)
@@ -516,12 +516,10 @@ func ValidString(s string) bool {
 // Code points that are out of range or a surrogate half are illegal.
 func ValidRune(r rune) bool {
        switch {
-       case r < 0:
-               return false
-       case surrogateMin <= r && r <= surrogateMax:
-               return false
-       case r > MaxRune:
-               return false
+       case 0 <= r && r < surrogateMin:
+               return true
+       case surrogateMax < r && r <= MaxRune:
+               return true
        }
-       return true
+       return false
 }