encoding/gob: replace runtime values with constants in init()

Current init() implementation in `encoding/gob/decode.go` checks int/uint/uintptr bit size with reflection in runtime. We could replace it with values available on compile stage. This should reduce time and allocations on binary start.
Results from GODEBUG=inittrace=1:
before:
init encoding/gob @4.4 ms, 0.21 ms clock, 43496 bytes, 652 allocs
after:
init encoding/gob @4.4 ms, 0.15 ms clock, 41672 bytes, 643 allocs

Updates #54184

Change-Id: I46dda2682fb92519da199415e29401d61edce697
Reviewed-on: https://go-review.googlesource.com/c/go/+/420455
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Rob Pike <r@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
This commit is contained in:
Tomasz Jezierski 2022-08-01 21:18:36 +02:00 committed by Rob Pike
parent 0c4db1e347
commit 0f6ee42fe0
1 changed files with 7 additions and 2 deletions

View File

@ -1228,9 +1228,14 @@ func (dec *Decoder) decodeIgnoredValue(wireId typeId) {
}
}
const (
intBits = 32 << (^uint(0) >> 63)
uintptrBits = 32 << (^uintptr(0) >> 63)
)
func init() {
var iop, uop decOp
switch reflect.TypeOf(int(0)).Bits() {
switch intBits {
case 32:
iop = decInt32
uop = decUint32
@ -1244,7 +1249,7 @@ func init() {
decOpTable[reflect.Uint] = uop
// Finally uintptr
switch reflect.TypeOf(uintptr(0)).Bits() {
switch uintptrBits {
case 32:
uop = decUint32
case 64: