@@ -60,6 +60,9 @@ func benchmarkFromFile(b *testing.B, filename string) {
6060
6161}
6262
63+ func BenchmarkSmall (b * testing.B ) { benchmarkFromFile (b , "payload-small" ) }
64+ func BenchmarkMedium (b * testing.B ) { benchmarkFromFile (b , "payload-medium" ) }
65+ func BenchmarkLarge (b * testing.B ) { benchmarkFromFile (b , "payload-large" ) }
6366func BenchmarkApache_builds (b * testing.B ) { benchmarkFromFile (b , "apache_builds" ) }
6467func BenchmarkCanada (b * testing.B ) { benchmarkFromFile (b , "canada" ) }
6568func BenchmarkCitm_catalog (b * testing.B ) { benchmarkFromFile (b , "citm_catalog" ) }
@@ -72,7 +75,7 @@ func BenchmarkMesh_pretty(b *testing.B) { benchmarkFromFile(b, "mesh.pretty")
7275func BenchmarkNumbers (b * testing.B ) { benchmarkFromFile (b , "numbers" ) }
7376func BenchmarkRandom (b * testing.B ) { benchmarkFromFile (b , "random" ) }
7477func BenchmarkTwitter (b * testing.B ) { benchmarkFromFile (b , "twitter" ) }
75- func BenchmarkTwitterescaped (b * testing.B ) { benchmarkFromFile (b , "twitterescaped" ) }
78+ func BenchmarkTwitterEscaped (b * testing.B ) { benchmarkFromFile (b , "twitterescaped" ) }
7679func BenchmarkUpdate_center (b * testing.B ) { benchmarkFromFile (b , "update-center" ) }
7780
7881func benchmarkJsoniter (b * testing.B , filename string ) {
@@ -138,3 +141,92 @@ func BenchmarkJsoniterRandom(b *testing.B) { benchmarkJsoniter(b, "rando
138141func BenchmarkJsoniterTwitter (b * testing.B ) { benchmarkJsoniter (b , "twitter" ) }
139142func BenchmarkJsoniterTwitterescaped (b * testing.B ) { benchmarkJsoniter (b , "twitterescaped" ) }
140143func BenchmarkJsoniterUpdate_center (b * testing.B ) { benchmarkJsoniter (b , "update-center" ) }
144+
145+ func BenchmarkJsonParserLarge (b * testing.B ) {
146+ largeFixture := loadCompressed (b , "payload-large" )
147+
148+ b .Run ("nocopy" , func (b * testing.B ) {
149+ pj := & ParsedJson {}
150+ b .SetBytes (int64 (len (largeFixture )))
151+ b .ReportAllocs ()
152+ b .ResetTimer ()
153+ var elem * Element
154+ var ar * Array
155+ var obj * Object
156+ var onlyKeys = map [string ]struct {}{
157+ "id" : {},
158+ "slug" : {},
159+ }
160+ const checkErrs = false
161+ for i := 0 ; i < b .N ; i ++ {
162+ // Reset tape
163+ var err error
164+ pj , err = Parse (largeFixture , pj , WithCopyStrings (false ))
165+ if checkErrs && err != nil {
166+ b .Fatal (err )
167+ }
168+ iter := pj .Iter ()
169+ elem , err = iter .FindElement ("users" , elem )
170+ if checkErrs && err != nil {
171+ b .Fatal (err )
172+ }
173+ ar , err = elem .Iter .Array (ar )
174+ if checkErrs && err != nil {
175+ b .Fatal (err )
176+ }
177+ ar .ForEach (func (t Type , i Iter ) {
178+ elem , err = i .FindElement ("username" , elem )
179+ if checkErrs && err != nil {
180+ b .Fatal (err )
181+ }
182+ _ , _ = elem .Iter .StringBytes ()
183+ })
184+
185+ elem , err = iter .FindElement ("topics/topics" , elem )
186+ if checkErrs && err != nil {
187+ b .Fatal (err )
188+ }
189+ ar , err = elem .Iter .Array (ar )
190+ if checkErrs && err != nil {
191+ b .Fatal (err )
192+ }
193+ ar .ForEach (func (t Type , i Iter ) {
194+ if true {
195+ // Use foreach...
196+ obj , err = i .Object (obj )
197+ if checkErrs && err != nil {
198+ b .Fatal (err )
199+ }
200+ obj .ForEach (func (key []byte , i Iter ) {
201+ if string (key ) == "id" {
202+ _ , err = i .Int ()
203+ if checkErrs && err != nil {
204+ b .Fatal (err )
205+ }
206+ }
207+ if string (key ) == "slug" {
208+ _ , err = i .StringBytes ()
209+ if checkErrs && err != nil {
210+ b .Fatal (err )
211+ }
212+ }
213+
214+ }, onlyKeys )
215+ } else {
216+ elem , err = i .FindElement ("id" , elem )
217+ if checkErrs && err != nil {
218+ b .Fatal (err )
219+ }
220+ _ , _ = elem .Iter .Int ()
221+ //b.Log(elem.Iter.Int())
222+ elem , err = i .FindElement ("slug" , elem )
223+ if checkErrs && err != nil {
224+ b .Fatal (err )
225+ }
226+ _ , _ = elem .Iter .StringBytes ()
227+ //b.Log(elem.Iter.String())
228+ }
229+ })
230+ }
231+ })
232+ }
0 commit comments