Description
I've been experimenting with alternate encodings for the PCDATA tables, with the goal of significantly improving decode speed, at possibly a slight increase in binary size.
@mknyszek, @dr2chase and I designed a format that's >4x faster to decode than the Go 1.21 tables, while increasing binary size by only 1–2.5%. This issue is to track (eventually) moving to this format in the compiler and runtime.
I've described the format here and have an out-of-tree implementation of the encoder and decoder (apologies for the messy, experimental code).
Here's an example benchmark, using the go
binary:
goos: linux
goarch: amd64
pkg: github.com/aclements/go-misc/pcvaluetab
cpu: 11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz
│ go.bench │
│ sec/op │
Decode/go/varint-cache-nohit-8 50.40n ± 2%
Decode/go/varint-cache-hit-8 10.23n ± 0%
Decode/go/varint-cache-none-8 42.46n ± 0%
Decode/go/alt-8 11.69n ± 1%
file size change: +1.975729%
All of the benchmarks generate a random sample of 1024 (PC, table) pairs to lookup and report the average lookup time.
"Decode/go/alt" is the new implementation. "varint-cache-nohit" is the current varint format, with no cache hits. "varint-cache-hit" is similar, but repeats each lookup 8 times to simulate a high cache hit rate. "varint-cache-none" is the varint format, but with no cache.
Here are the same results for github.com/kubernetes/kubernetes/cmd/kubelet:
goos: linux
goarch: amd64
pkg: github.com/aclements/go-misc/pcvaluetab
cpu: 11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz
│ kubelet.bench │
│ sec/op │
Decode/kubelet/varint-cache-nohit-8 56.21n ± 1%
Decode/kubelet/varint-cache-hit-8 11.04n ± 1%
Decode/kubelet/varint-cache-none-8 48.61n ± 1%
Decode/kubelet/alt-8 11.80n ± 1%
file size change: +1.248393%
Metadata
Metadata
Assignees
Labels
Type
Projects
Status