1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
/*
Each test should process 24kb json record (based on Discourse API)
It should read 2 arrays, and for each item in array get few fields.
Basically it means processing full JSON file.
*/
package benchmark
import (
"github.com/buger/jsonparser"
"testing"
// "github.com/Jeffail/gabs"
// "github.com/bitly/go-simplejson"
"encoding/json"
"github.com/a8m/djson"
jlexer "github.com/mailru/easyjson/jlexer"
"github.com/pquerna/ffjson/ffjson"
// "github.com/antonholmquist/jason"
// "fmt"
)
/*
github.com/buger/jsonparser
*/
func BenchmarkJsonParserLarge(b *testing.B) {
for i := 0; i < b.N; i++ {
jsonparser.ArrayEach(largeFixture, func(value []byte, dataType jsonparser.ValueType, offset int, err error) {
jsonparser.Get(value, "username")
nothing()
}, "users")
jsonparser.ArrayEach(largeFixture, func(value []byte, dataType jsonparser.ValueType, offset int, err error) {
jsonparser.GetInt(value, "id")
jsonparser.Get(value, "slug")
nothing()
}, "topics", "topics")
}
}
/*
encoding/json
*/
func BenchmarkEncodingJsonStructLarge(b *testing.B) {
for i := 0; i < b.N; i++ {
var data LargePayload
json.Unmarshal(largeFixture, &data)
for _, u := range data.Users {
nothing(u.Username)
}
for _, t := range data.Topics.Topics {
nothing(t.Id, t.Slug)
}
}
}
func BenchmarkEncodingJsonInterfaceLarge(b *testing.B) {
for i := 0; i < b.N; i++ {
var data interface{}
json.Unmarshal(largeFixture, &data)
m := data.(map[string]interface{})
users := m["users"].([]interface{})
for _, u := range users {
nothing(u.(map[string]interface{})["username"].(string))
}
topics := m["topics"].(map[string]interface{})["topics"].([]interface{})
for _, t := range topics {
tI := t.(map[string]interface{})
nothing(tI["id"].(float64), tI["slug"].(string))
}
}
}
/*
github.com/pquerna/ffjson
*/
func BenchmarkFFJsonLarge(b *testing.B) {
for i := 0; i < b.N; i++ {
var data LargePayload
ffjson.Unmarshal(largeFixture, &data)
for _, u := range data.Users {
nothing(u.Username)
}
for _, t := range data.Topics.Topics {
nothing(t.Id, t.Slug)
}
}
}
/*
github.com/mailru/easyjson
*/
func BenchmarkEasyJsonLarge(b *testing.B) {
for i := 0; i < b.N; i++ {
lexer := &jlexer.Lexer{Data: largeFixture}
data := new(LargePayload)
data.UnmarshalEasyJSON(lexer)
for _, u := range data.Users {
nothing(u.Username)
}
for _, t := range data.Topics.Topics {
nothing(t.Id, t.Slug)
}
}
}
/*
github.com/a8m/djson
*/
func BenchmarkDjsonLarge(b *testing.B) {
for i := 0; i < b.N; i++ {
m, _ := djson.DecodeObject(largeFixture)
users := m["users"].([]interface{})
for _, u := range users {
nothing(u.(map[string]interface{})["username"].(string))
}
topics := m["topics"].(map[string]interface{})["topics"].([]interface{})
for _, t := range topics {
tI := t.(map[string]interface{})
nothing(tI["id"].(float64), tI["slug"].(string))
}
}
}
|