diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2024-04-15 12:36:20 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2024-04-15 13:23:33 +0000 |
| commit | 80ce88419762e4342971463033802fea7cdb2973 (patch) | |
| tree | e522a76cfc92dfe1c31470f2993923737d641d3d /prog/decodeexec.go | |
| parent | 416332e39df7236896d0d13bebcc7bb13105c0a4 (diff) | |
prog: use leb128 for exec encoding
Switch from uint64 to leb128 encoding for integers.
This almost more than halves serialized size:
- exec sizes: 10%:2160 50%:4792 90%:14288
+ exec sizes: 10%:597 50%:1438 90%:7145
and makes it smaller than the text serialization:
text sizes: 10%:837 50%:1591 90%:10156
Diffstat (limited to 'prog/decodeexec.go')
| -rw-r--r-- | prog/decodeexec.go | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/prog/decodeexec.go b/prog/decodeexec.go index db89aa82e..4574ef845 100644 --- a/prog/decodeexec.go +++ b/prog/decodeexec.go @@ -4,6 +4,7 @@ package prog import ( + "encoding/binary" "fmt" "reflect" ) @@ -218,15 +219,16 @@ func (dec *execDecoder) readArg() ExecArg { } func (dec *execDecoder) read() uint64 { - if len(dec.data) < 8 { - dec.setErr(fmt.Errorf("exec program overflow")) - } if dec.err != nil { return 0 } - v := HostEndian.Uint64(dec.data) - dec.data = dec.data[8:] - return v + v, n := binary.Varint(dec.data) + if n <= 0 { + dec.setErr(fmt.Errorf("exec program overflow")) + return 0 + } + dec.data = dec.data[n:] + return uint64(v) } func (dec *execDecoder) readBlob(size uint64) []byte { |
