Cached string indexing in inner loop of Btoui64.
Before:
strconv_test.BenchmarkAtoi
5000000 309 ns/op
strconv_test.BenchmarkAtoiNeg
5000000 325 ns/op
strconv_test.BenchmarkAtoi64
5000000 465 ns/op
strconv_test.BenchmarkAtoi64Neg
5000000 469 ns/op
After:
strconv_test.BenchmarkAtoi
10000000 182 ns/op
strconv_test.BenchmarkAtoiNeg
10000000 193 ns/op
strconv_test.BenchmarkAtoi64
10000000 251 ns/op
strconv_test.BenchmarkAtoi64Neg
10000000 258 ns/op
R=golang-dev, gri
CC=golang-dev
https://golang.org/cl/
1227042
for i := 0; i < len(s); i++ {
var v byte
+ d := s[i]
switch {
- case '0' <= s[i] && s[i] <= '9':
- v = s[i] - '0'
- case 'a' <= s[i] && s[i] <= 'z':
- v = s[i] - 'a' + 10
- case 'A' <= s[i] && s[i] <= 'Z':
- v = s[i] - 'A' + 10
+ case '0' <= d && d <= '9':
+ v = d - '0'
+ case 'a' <= d && d <= 'z':
+ v = d - 'a' + 10
+ case 'A' <= d && d <= 'Z':
+ v = d - 'A' + 10
default:
n = 0
err = os.EINVAL