Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/zerosnake0/go-json-benchmark
Benchmark of Golang JSON Libraries
https://github.com/zerosnake0/go-json-benchmark
benchmark djson json jsoniter jzon ugorji ujson
Last synced: 3 months ago
JSON representation
Benchmark of Golang JSON Libraries
- Host: GitHub
- URL: https://github.com/zerosnake0/go-json-benchmark
- Owner: zerosnake0
- License: mit
- Created: 2019-11-10T08:00:15.000Z (almost 5 years ago)
- Default Branch: master
- Last Pushed: 2020-10-08T08:21:03.000Z (about 4 years ago)
- Last Synced: 2024-05-05T18:37:15.275Z (6 months ago)
- Topics: benchmark, djson, json, jsoniter, jzon, ugorji, ujson
- Language: Go
- Homepage:
- Size: 56.6 KB
- Stars: 9
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-go-extra - go-json-benchmark - 11-10T08:00:15Z|2020-10-08T08:21:03Z| (Benchmarks / Other Software)
README
[![Mentioned in Awesome Go](https://awesome.re/mentioned-badge.svg)](https://github.com/avelino/awesome-go)
[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit)# Introduction
This is a benchmark for the json packages.
You are welcome to open an issue if you find anything wrong or out of date.# TL;DR
In conclusion, the `github.com/json-iterator/go` is your first choice,
it provides you with lots of useful features, oo design and high performance.# How to run
```shell
go test -v -bench ./...
```# Example result
```shell
GOGC=off go test -bench=. -benchmem
```The result may vary according to the different environment.
Use the result only as a reference.| | | | ns/op | B/op | allocs/op |
| --- | --- | --- | ----- | ---- | --------- |
| 10Fields_Iterator_Object | jsoniter-readObjCB-8 | 1458022 | 810 | 144 | 14 |
| 10Fields_Iterator_Object | jsoniter-readObj-8 | 1369156 | 813 | 144 | 14 |
| 10Fields_Iterator_Object | jsonparser-8 | 1357131 | 908 | 80 | 4 |
| 10Fields_Iterator_Object | jzon-readObj-8 | 1239000 | 955 | 144 | 14 |
| 10Fields_Iterator_Object | jzon-readObjCB-8 | 1204593 | 991 | 144 | 14 |
| | | | | | |
| 10Fields_Unmarshal_Interface | djson-8 | 440643 | 2576 | 1174 | 27 |
| 10Fields_Unmarshal_Interface | easyjson-8 | 422460 | 2894 | 1174 | 27 |
| 10Fields_Unmarshal_Interface | jzon-8 | 414544 | 2904 | 1190 | 28 |
| 10Fields_Unmarshal_Interface | jzon-fast-8 | 425950 | 2917 | 1190 | 28 |
| 10Fields_Unmarshal_Interface | ujson-8 | 337881 | 3494 | 1494 | 38 |
| 10Fields_Unmarshal_Interface | jsoniter-compatible-8 | 320720 | 3758 | 1350 | 38 |
| 10Fields_Unmarshal_Interface | jsoniter-8 | 347126 | 4216 | 1350 | 38 |
| 10Fields_Unmarshal_Interface | json-8 | 229218 | 5532 | 1414 | 36 |
| 10Fields_Unmarshal_Interface | ugorji-8 | 212991 | 5608 | 2478 | 36 |
| | | | | | |
| 10Fields_Unmarshal_StructWithTag | jsoniter-8 | 1000000 | 1028 | 192 | 5 |
| 10Fields_Unmarshal_StructWithTag | jsoniter-compatible-8 | 1223282 | 1034 | 192 | 5 |
| 10Fields_Unmarshal_StructWithTag | jzon-8 | 1000000 | 1106 | 192 | 5 |
| 10Fields_Unmarshal_StructWithTag | jzon-fast-8 | 1000000 | 1132 | 192 | 5 |
| 10Fields_Unmarshal_StructWithTag | ugorji-8 | 476871 | 2705 | 1088 | 7 |
| 10Fields_Unmarshal_StructWithTag | json-8 | 274917 | 4346 | 432 | 14 |
| | | | | | |
| 10Fields_Unmarshal_StructWoTag | jsoniter-compatible-8 | 887858 | 1406 | 256 | 15 |
| 10Fields_Unmarshal_StructWoTag | jsoniter-8 | 872038 | 1451 | 256 | 15 |
| 10Fields_Unmarshal_StructWoTag | jzon-8 | 694782 | 1607 | 192 | 5 |
| 10Fields_Unmarshal_StructWoTag | json-8 | 242374 | 4879 | 432 | 14 |
| | | | | | |
| 10Fields_Valid | gjson-8 | 2991547 | 400 | 0 | 0 |
| 10Fields_Valid | jzon-8 | 2099695 | 567 | 0 | 0 |
| 10Fields_Valid | jsoniter-compatible-8 | 1583869 | 736 | 64 | 10 |
| 10Fields_Valid | jsoniter-8 | 1628780 | 758 | 64 | 10 |
| 10Fields_Valid | json-8 | 1000000 | 1114 | 0 | 0 |
| | | | | | |
| 20Fields_Unmarshal_Interface | jzon-fast-8 | 187482 | 6285 | 2732 | 53 |
| 20Fields_Unmarshal_Interface | jzon-8 | 193900 | 6516 | 2731 | 53 |
| 20Fields_Unmarshal_Interface | djson-8 | 238552 | 6606 | 2716 | 52 |
| 20Fields_Unmarshal_Interface | easyjson-8 | 194299 | 6974 | 2716 | 52 |
| 20Fields_Unmarshal_Interface | ujson-8 | 163780 | 7551 | 3340 | 73 |
| 20Fields_Unmarshal_Interface | jsoniter-compatible-8 | 150829 | 7872 | 3051 | 73 |
| 20Fields_Unmarshal_Interface | jsoniter-8 | 139962 | 8286 | 3051 | 73 |
| 20Fields_Unmarshal_Interface | json-8 | 121875 | 10689 | 3003 | 67 |
| 20Fields_Unmarshal_Interface | ugorji-8 | 119270 | 10768 | 4018 | 61 |
| | | | | | |
| 20Fields_Unmarshal_StructWithTag | jzon-8 | 512673 | 2345 | 368 | 9 |
| 20Fields_Unmarshal_StructWithTag | jzon-fast-8 | 497636 | 2402 | 368 | 9 |
| 20Fields_Unmarshal_StructWithTag | ugorji-8 | 484503 | 2532 | 1088 | 7 |
| 20Fields_Unmarshal_StructWithTag | jsoniter-8 | 420992 | 2780 | 512 | 29 |
| 20Fields_Unmarshal_StructWithTag | jsoniter-compatible-8 | 420163 | 2877 | 512 | 29 |
| 20Fields_Unmarshal_StructWithTag | json-8 | 145645 | 8466 | 648 | 24 |
| | | | | | |
| 20Fields_Unmarshal_StructWoTag | jsoniter-compatible-8 | 425262 | 2724 | 512 | 29 |
| 20Fields_Unmarshal_StructWoTag | jsoniter-8 | 435942 | 2758 | 512 | 29 |
| 20Fields_Unmarshal_StructWoTag | jzon-8 | 251348 | 4908 | 1057 | 9 |
| 20Fields_Unmarshal_StructWoTag | json-8 | 116900 | 9759 | 648 | 24 |
| | | | | | |
| 20Fields_Valid | gjson-8 | 1483011 | 776 | 0 | 0 |
| 20Fields_Valid | jzon-8 | 1000000 | 1070 | 0 | 0 |
| 20Fields_Valid | jsoniter-compatible-8 | 813631 | 1376 | 144 | 20 |
| 20Fields_Valid | jsoniter-8 | 772488 | 1418 | 144 | 20 |
| 20Fields_Valid | json-8 | 564940 | 2138 | 0 | 0 |
| | | | | | |# TODO
- add medium & large payload tests
- auto benchmark# Packages tested
## feature list
| repo | version | unmarshal (interface) | unmarshal (struct) | iterator | valid |
| -------------------------------------- | ------- | --------------- | --------------- | --- | --- |
| encoding/json | 1.15.2 | x | x | | x |
| github.com/json-iterator/go | 1.1.10 | x | x | x | x |
| github.com/buger/jsonparser | 1.0.0 | | | x | |
| github.com/a8m/djson | c02c5ae | x | | | |
| github.com/mailru/easyjson | 0.7.6 | x | (1) | | |
| github.com/mreiferson/go-ujson | c02629f | x(2) | | | |
| github.com/ugorji/go/codec | 1.1.10 | x(3) | x(4) | | |
| github.com/tidwall/gjson(5) | 1.6.1 | | (6) | | x |
| github.com/zerosnake0/jzon | 0.0.5 | x | x | x | x |### notes:
1. easyjson use its own marshaler/unmarshaler, which is not tested
2. ujson use ujson.numeric which is its internal type for numbers
3. ugorji need to be configured in order to be compatible with standard library
4. ugorji decode into structure:
- can decode into a structure with tag
- cannot decode into a structure without a tag unless all field names are as same as tag names
- use its own marshaler/unmarshaler (codec.Selfer) interface to decode structure
5. gjson deprecated its unmarshal methods from `v1.4.0`
6. gjson only decode into structure fields with tag (`<= v1.3.6`)# The following packages are not tested
| repo | reason |
| ------------------------------- | ------------------------------------------ |
| github.com/Jeffail/gabs | the encoding/decoding uses `encoding/json` |
| github.com/bitly/go-simplejson | the encoding/decoding uses `encoding/json` |
| github.com/antonholmquist/jason | the encoding/decoding uses `encoding/json` |
| github.com/pquerna/ffjson | the encoding/decoding uses `encoding/json` (if the custom interface is not provided) |