From 80ce88419762e4342971463033802fea7cdb2973 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Mon, 15 Apr 2024 12:36:20 +0200 Subject: 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 --- prog/decodeexec.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'prog/decodeexec.go') 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 { -- cgit mrf-deployment