@@ -16,6 +16,8 @@ import (
1616 "github.com/ugorji/go/codec"
1717 "testing"
1818 // "fmt"
19+ "bytes"
20+ "errors"
1921)
2022
2123/*
@@ -35,22 +37,22 @@ func BenchmarkJsonParserMedium(b *testing.B) {
3537}
3638
3739func BenchmarkJsonParserEachKeyManualMedium (b * testing.B ) {
38- for i := 0 ; i < b .N ; i ++ {
39- paths := [][]string {
40- []string {"person" , "name" , "fullName" },
41- []string {"person" , "github" , "followers" },
42- []string {"company" },
43- []string {"person" , "gravatar" , "avatars" },
44- }
40+ paths := [][]string {
41+ []string {"person" , "name" , "fullName" },
42+ []string {"person" , "github" , "followers" },
43+ []string {"company" },
44+ []string {"person" , "gravatar" , "avatars" },
45+ }
4546
46- jsonparser .EachKey (mediumFixture , func (idx int , value []byte , vt jsonparser.ValueType , err error ){
47+ for i := 0 ; i < b .N ; i ++ {
48+ jsonparser .EachKey (mediumFixture , func (idx int , value []byte , vt jsonparser.ValueType , err error ) {
4749 switch idx {
4850 case 0 :
49- // jsonparser.ParseString(value)
51+ // jsonparser.ParseString(value)
5052 case 1 :
5153 jsonparser .ParseInt (value )
5254 case 2 :
53- // jsonparser.ParseString(value)
55+ // jsonparser.ParseString(value)
5456 case 3 :
5557 jsonparser .ArrayEach (value , func (avalue []byte , dataType jsonparser.ValueType , offset int , err error ) {
5658 jsonparser .Get (avalue , "url" )
@@ -60,6 +62,90 @@ func BenchmarkJsonParserEachKeyManualMedium(b *testing.B) {
6062 }
6163}
6264
65+ func BenchmarkJsonParserEachKeyStructMedium (b * testing.B ) {
66+ paths := [][]string {
67+ []string {"person" , "name" , "fullName" },
68+ []string {"person" , "github" , "followers" },
69+ []string {"company" },
70+ []string {"person" , "gravatar" , "avatars" },
71+ }
72+
73+ for i := 0 ; i < b .N ; i ++ {
74+ data := MediumPayload {
75+ Person : & CBPerson {
76+ Name : & CBName {},
77+ Github : & CBGithub {},
78+ Gravatar : & CBGravatar {},
79+ },
80+ }
81+
82+ jsonparser .EachKey (mediumFixture , func (idx int , value []byte , vt jsonparser.ValueType , err error ) {
83+ switch idx {
84+ case 0 :
85+ data .Person .Name .FullName , _ = jsonparser .ParseString (value )
86+ case 1 :
87+ v , _ := jsonparser .ParseInt (value )
88+ data .Person .Github .Followers = int (v )
89+ case 2 :
90+ json .Unmarshal (value , & data .Company ) // we don't have a JSON -> map[string]interface{} function yet, so use standard encoding/json here
91+ case 3 :
92+ var avatars []* CBAvatar
93+ jsonparser .ArrayEach (value , func (avalue []byte , dataType jsonparser.ValueType , offset int , err error ) {
94+ url , _ := jsonparser .ParseString (avalue )
95+ avatars = append (avatars , & CBAvatar {Url : url })
96+ })
97+ data .Person .Gravatar .Avatars = avatars
98+ }
99+ }, paths ... )
100+ }
101+ }
102+
103+ func BenchmarkJsonParserObjectEachStructMedium (b * testing.B ) {
104+ nameKey , githubKey , gravatarKey := []byte ("name" ), []byte ("github" ), []byte ("gravatar" )
105+ errStop := errors .New ("stop" )
106+
107+ for i := 0 ; i < b .N ; i ++ {
108+ data := MediumPayload {
109+ Person : & CBPerson {
110+ Name : & CBName {},
111+ Github : & CBGithub {},
112+ Gravatar : & CBGravatar {},
113+ },
114+ }
115+
116+ missing := 3
117+
118+ jsonparser .ObjectEach (mediumFixture , func (k , v []byte , vt jsonparser.ValueType , o int ) error {
119+ switch {
120+ case bytes .Equal (k , nameKey ):
121+ data .Person .Name .FullName , _ = jsonparser .GetString (v , "fullName" )
122+ missing --
123+ case bytes .Equal (k , githubKey ):
124+ x , _ := jsonparser .GetInt (v , "followers" )
125+ data .Person .Github .Followers = int (x )
126+ missing --
127+ case bytes .Equal (k , gravatarKey ):
128+ var avatars []* CBAvatar
129+ jsonparser .ArrayEach (v , func (avalue []byte , dataType jsonparser.ValueType , offset int , err error ) {
130+ url , _ := jsonparser .ParseString (avalue )
131+ avatars = append (avatars , & CBAvatar {Url : url })
132+ }, "avatars" )
133+ data .Person .Gravatar .Avatars = avatars
134+ missing --
135+ }
136+
137+ if missing == 0 {
138+ return errStop
139+ } else {
140+ return nil
141+ }
142+ }, "person" )
143+
144+ cv , _ , _ , _ := jsonparser .Get (mediumFixture , "company" )
145+ json .Unmarshal (cv , & data .Company )
146+ }
147+ }
148+
63149/*
64150 encoding/json
65151*/
0 commit comments