- Notifications
You must be signed in to change notification settings - Fork 18.5k
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