]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/gob: replace runtime values with constants in init()
authorTomasz Jezierski <tjomek.jezierski@gmail.com>
Mon, 1 Aug 2022 19:18:36 +0000 (21:18 +0200)
committerRob Pike <r@golang.org>
Mon, 8 Aug 2022 06:16:59 +0000 (06:16 +0000)
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>
src/encoding/gob/decode.go

index eea2924f1ad6274f48fdbe0f5c63bce07a1be41c..7bca13c957a92b45a175ec9b880a946641f22b3e 100644 (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: