go_serialization_benchmarks
go_serialization_benchmarks copied to clipboard
Benchmarks of Go serialization methods
Benchmarks of Go serialization methods
This is a test suite for benchmarking various Go serialization methods.
Current Serialization Results
https://alecthomas.github.io/go_serialization_benchmarks
Running the benchmarks
go test -bench=.
To validate the correctness of the serializers:
VALIDATE=1 go test -bench=. -benchtime=1ms
To update the benchmark report:
go test -tags genreport -run TestGenerateReport
To update the benchmark report with using a longer run benchmark (to get more accurate results):
go test -tags genreport -run TestGenerateReport -benchtime 10s -timeout 1h
Recommendation
If correctness and interoperability are the most important factors JSON or Protobuf are your best options.
But as always, make your own choice based on your requirements.
Adding New Serializers
Review the following instructions before opening the PR to add a new serializer:
- Create all the required serializer code in
internal/<short serializer name>
. - Add an entry to the serializer in benchmarks.go.
- If the serializer supports both reusing/not reusing its marshalling buffer:
- Add both a
serializer
andserializer/reuse
entries, each one respectively reusing/not reusing the resulting marshalling buffer. Set theBufferReuseMarshal
flag accordingly.
- Add both a
- If the serializer supports both safe and unsafe string unmarshalling:
- Add both a
serializer
andserializer/unsafe
entries, each one respectively unmarshalling into safe and unsafe strings. Set theUnsafeStringUnmarshal
flag accordingly.
- Add both a
- If the serializer supports both marshalling buffer reuse and unsafe string
unmarshalling, merge both options into a single
serializer/unsafe_reuse
entry (check the baseline serializer for an example). - Regenerate the report by running:
go test -tags genreport -run TestGenerateReport
- Include the updated report data in your PR
Data
The data being serialized is the following structure with randomly generated values:
type A struct {
Name string
BirthDay time.Time
Phone string
Siblings int
Spouse bool
Money float64
}