runtime: use staticuint64s instead of staticbytes for 1-length strings

This was the last remaining use of staticbytes, so we can now
delete it.

The new code appears slightly faster on amd64:

name                   old time/op  new time/op  delta
SliceByteToString/1-4  6.29ns ± 2%  5.89ns ± 1%  -6.46%  (p=0.000 n=14+14)

This may not be the case on the big-endian architectures, since they have
to do an extra addition.

Updates #37612

Change-Id: Icb84c5911ba025f798de152849992a55be99e4f3
Reviewed-on: https://go-review.googlesource.com/c/go/+/221979
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Diogo Pinela 2020-03-05 00:28:05 +00:00 committed by Josh Bleecher Snyder
parent 4de606b55f
commit bda42a7a78
2 changed files with 6 additions and 43 deletions

View file

@ -6,6 +6,7 @@ package runtime
import (
"internal/bytealg"
"runtime/internal/sys"
"unsafe"
)
@ -90,7 +91,11 @@ func slicebytetostring(buf *tmpBuf, b []byte) (str string) {
msanread(unsafe.Pointer(&b[0]), uintptr(l))
}
if l == 1 {
stringStructOf(&str).str = unsafe.Pointer(&staticbytes[b[0]])
p := unsafe.Pointer(&staticuint64s[b[0]])
if sys.BigEndian {
p = add(p, 7)
}
stringStructOf(&str).str = p
stringStructOf(&str).len = 1
return
}
@ -231,12 +236,6 @@ func stringStructOf(sp *string) *stringStruct {
}
func intstring(buf *[4]byte, v int64) (s string) {
if v >= 0 && v < runeSelf {
stringStructOf(&s).str = unsafe.Pointer(&staticbytes[v])
stringStructOf(&s).len = 1
return
}
var b []byte
if buf != nil {
b = buf[:]