Last active
November 4, 2021 13:15
-
-
Save jgfrancisco/318b2f5ab77c7f5acb88 to your computer and use it in GitHub Desktop.
compress protobuf
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"bytes" | |
"compress/flate" | |
"compress/gzip" | |
"compress/zlib" | |
"errors" | |
"fmt" | |
"io/ioutil" | |
"math/rand" | |
"time" | |
"github.com/gogo/protobuf/proto" | |
"github.com/zvelo/adfraud/msg" | |
) | |
var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") | |
func randSeq(n int) string { | |
b := make([]rune, n) | |
for i := range b { | |
b[i] = letters[rand.Intn(len(letters))] | |
} | |
return string(b) | |
} | |
func check(err error) { | |
if err != nil { | |
panic(err) | |
} | |
} | |
func main() { | |
var ( | |
buf bytes.Buffer | |
n int | |
s time.Time | |
elapsed time.Duration | |
err error | |
obj []byte | |
test = msg.Request{ | |
Id: randSeq(1024 * 2), | |
} | |
) | |
t, err := proto.Marshal(&test) | |
check(err) | |
fmt.Printf("size of protobuf: %d\n\n", len(t)) | |
buf.Reset() | |
fw, err := flate.NewWriter(&buf, 9) | |
check(err) | |
defer fw.Close() | |
s = time.Now() | |
n, err = fw.Write(t) | |
check(err) | |
fw.Close() // need to explicitly close and not just flush to prevent EOF error | |
elapsed = time.Since(s) | |
obj = buf.Bytes() | |
fmt.Printf("written to flated: %d\n", n) | |
fmt.Printf("size of flated: %d\n", len(obj)) | |
fmt.Printf("elapsed flated: %v\n\n", elapsed) | |
err = decompressFlate(obj, &test) | |
check(err) | |
buf.Reset() | |
zw := zlib.NewWriter(&buf) | |
defer zw.Close() | |
s = time.Now() | |
n, err = zw.Write(t) | |
check(err) | |
zw.Flush() | |
elapsed = time.Since(s) | |
obj = buf.Bytes() | |
fmt.Printf("written to zipped: %d\n", n) | |
fmt.Printf("size of zlib: %d\n", len(obj)) | |
fmt.Printf("elapsed zlib: %v\n\n", elapsed) | |
buf.Reset() | |
gw := gzip.NewWriter(&buf) | |
defer gw.Close() | |
s = time.Now() | |
n, err = gw.Write(t) | |
check(err) | |
gw.Flush() | |
elapsed = time.Since(s) | |
obj = buf.Bytes() | |
fmt.Printf("written to gzipped: %d\n", n) | |
fmt.Printf("size of gzip: %d\n", len(obj)) | |
fmt.Printf("elapsed gzip: %v\n\n", elapsed) | |
} | |
func decompressFlate(obj []byte, expected *msg.Request) error { | |
fmt.Println("Decompressing") | |
data := bytes.NewReader(obj) | |
r := flate.NewReader(data) | |
enflate, err := ioutil.ReadAll(r) | |
if err != nil { | |
panic(err) | |
} | |
result := msg.Request{} | |
proto.Unmarshal(enflate, &result) | |
if result.Id != expected.Id { | |
fmt.Printf("RESULT[%s] != EXPECTED[%s]\n", result.Id, expected.Id) | |
return errors.New("not equal") | |
} | |
fmt.Println("DECOMPRESSION EQUAL") | |
return nil | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
gzip time improves when running after flate