github.com/intel-go/fastjson@v0.0.0-20170329170629-f846ae58a1ab/bench_test.go (about) 1 // Copyright 2011 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Large data benchmark. 6 // The JSON data is a summary of agl's changes in the 7 // go, webkit, and chromium open source projects. 8 // We benchmark converting between the JSON form 9 // and in-memory data structures. 10 11 package fastjson 12 13 import ( 14 "bytes" 15 "compress/gzip" 16 "io/ioutil" 17 "os" 18 "strings" 19 "testing" 20 ) 21 22 type codeResponse struct { 23 Tree *codeNode `json:"tree"` 24 Username string `json:"username"` 25 } 26 27 type codeNode struct { 28 Name string `json:"name"` 29 Kids []*codeNode `json:"kids"` 30 CLWeight float64 `json:"cl_weight"` 31 Touches int `json:"touches"` 32 MinT int64 `json:"min_t"` 33 MaxT int64 `json:"max_t"` 34 MeanT int64 `json:"mean_t"` 35 } 36 37 var testData [][]byte 38 var codeJSON []byte 39 var codeStruct codeResponse 40 var fileNames = [...]string{"testdata/canada.json.gz", 41 "testdata/code.json.gz", 42 "testdata/large-dict.json.gz", 43 "testdata/medium-dict.json.gz"} 44 45 func codeInit() { 46 f, err := os.Open("testdata/code.json.gz") 47 if err != nil { 48 panic(err) 49 } 50 defer f.Close() 51 gz, err := gzip.NewReader(f) 52 if err != nil { 53 panic(err) 54 } 55 data, err := ioutil.ReadAll(gz) 56 if err != nil { 57 panic(err) 58 } 59 60 codeJSON = data 61 62 if err := Unmarshal(codeJSON, &codeStruct); err != nil { 63 panic("unmarshal code.json: " + err.Error()) 64 } 65 66 if data, err = Marshal(&codeStruct); err != nil { 67 panic("marshal code.json: " + err.Error()) 68 } 69 70 if !bytes.Equal(data, codeJSON) { 71 println("different lengths", len(data), len(codeJSON)) 72 for i := 0; i < len(data) && i < len(codeJSON); i++ { 73 if data[i] != codeJSON[i] { 74 println("re-marshal: changed at byte", i) 75 println("orig: ", string(codeJSON[i-10:i+10])) 76 println("new: ", string(data[i-10:i+10])) 77 break 78 } 79 } 80 panic("re-marshal code.json: different result") 81 } 82 testData = make([][]byte, len(fileNames)) 83 84 for i, name := range fileNames { 85 f, err = os.Open(name) 86 if err != nil { 87 panic(err) 88 } 89 defer f.Close() 90 gz, err = gzip.NewReader(f) 91 if err != nil { 92 panic(err) 93 } 94 testData[i], err = ioutil.ReadAll(gz) 95 if err != nil { 96 panic(err) 97 } 98 var jsonObj interface{} 99 if err = Unmarshal(testData[i], &jsonObj); err != nil { 100 panic("unmarshal code.json: " + err.Error()) 101 } 102 } 103 104 } 105 106 func BenchmarkCodeEncoder(b *testing.B) { 107 if codeJSON == nil { 108 b.StopTimer() 109 codeInit() 110 b.StartTimer() 111 } 112 enc := NewEncoder(ioutil.Discard) 113 for i := 0; i < b.N; i++ { 114 if err := enc.Encode(&codeStruct); err != nil { 115 b.Fatal("Encode:", err) 116 } 117 } 118 b.SetBytes(int64(len(codeJSON))) 119 } 120 121 func BenchmarkCodeMarshal(b *testing.B) { 122 if codeJSON == nil { 123 b.StopTimer() 124 codeInit() 125 b.StartTimer() 126 } 127 for i := 0; i < b.N; i++ { 128 if _, err := Marshal(&codeStruct); err != nil { 129 b.Fatal("Marshal:", err) 130 } 131 } 132 b.SetBytes(int64(len(codeJSON))) 133 } 134 135 func BenchmarkCodeDecoder(b *testing.B) { 136 if codeJSON == nil { 137 b.StopTimer() 138 codeInit() 139 b.StartTimer() 140 } 141 var buf bytes.Buffer 142 dec := NewDecoder(&buf) 143 var r codeResponse 144 for i := 0; i < b.N; i++ { 145 buf.Write(codeJSON) 146 // hide EOF 147 buf.WriteByte('\n') 148 buf.WriteByte('\n') 149 buf.WriteByte('\n') 150 if err := dec.Decode(&r); err != nil { 151 b.Fatal("Decode:", err) 152 } 153 } 154 b.SetBytes(int64(len(codeJSON))) 155 } 156 157 func BenchmarkDecoderStream(b *testing.B) { 158 b.StopTimer() 159 var buf bytes.Buffer 160 dec := NewDecoder(&buf) 161 buf.WriteString(`"` + strings.Repeat("x", 1000000) + `"` + "\n\n\n") 162 var x interface{} 163 if err := dec.Decode(&x); err != nil { 164 b.Fatal("Decode:", err) 165 } 166 ones := strings.Repeat(" 1\n", 300000) + "\n\n\n" 167 b.StartTimer() 168 for i := 0; i < b.N; i++ { 169 if i%300000 == 0 { 170 buf.WriteString(ones) 171 } 172 x = nil 173 if err := dec.Decode(&x); err != nil || x != 1.0 { 174 b.Fatalf("Decode: %v after %d", err, i) 175 } 176 } 177 } 178 179 func BenchmarkCodeUnmarshal(b *testing.B) { 180 if codeJSON == nil { 181 b.StopTimer() 182 codeInit() 183 b.StartTimer() 184 } 185 for i := 0; i < b.N; i++ { 186 var r codeResponse 187 if err := Unmarshal(codeJSON, &r); err != nil { 188 b.Fatal("Unmarshal:", err) 189 } 190 } 191 b.SetBytes(int64(len(codeJSON))) 192 } 193 194 func BenchmarkCodeUnmarshalReuse(b *testing.B) { 195 if codeJSON == nil { 196 b.StopTimer() 197 codeInit() 198 b.StartTimer() 199 } 200 var r codeResponse 201 for i := 0; i < b.N; i++ { 202 if err := Unmarshal(codeJSON, &r); err != nil { 203 b.Fatal("Unmarshal:", err) 204 } 205 } 206 } 207 208 func BenchmarkCodeUnmarshalManyNumbers(b *testing.B) { 209 if codeJSON == nil { 210 b.StopTimer() 211 codeInit() 212 b.StartTimer() 213 } 214 for i := 0; i < b.N; i++ { 215 var r interface{} 216 if err := Unmarshal(testData[0], &r); err != nil { 217 b.Fatal("Unmarshal:", err) 218 } 219 } 220 b.SetBytes(int64(len(testData[0]))) 221 } 222 223 func BenchmarkCodeUnmarshalNoReflect(b *testing.B) { 224 if codeJSON == nil { 225 b.StopTimer() 226 codeInit() 227 b.StartTimer() 228 } 229 for i := 0; i < b.N; i++ { 230 var r interface{} 231 if err := Unmarshal(testData[1], &r); err != nil { 232 b.Fatal("Unmarshal:", err) 233 } 234 } 235 b.SetBytes(int64(len(testData[1]))) 236 } 237 238 func BenchmarkCodeUnmarshalLargeFile(b *testing.B) { 239 if codeJSON == nil { 240 b.StopTimer() 241 codeInit() 242 b.StartTimer() 243 } 244 for i := 0; i < b.N; i++ { 245 var r interface{} 246 if err := Unmarshal(testData[2], &r); err != nil { 247 b.Fatal("Unmarshal:", err) 248 } 249 } 250 b.SetBytes(int64(len(testData[2]))) 251 } 252 253 func BenchmarkCodeUnmarshalMediumFile(b *testing.B) { 254 if codeJSON == nil { 255 b.StopTimer() 256 codeInit() 257 b.StartTimer() 258 } 259 for i := 0; i < b.N; i++ { 260 var r interface{} 261 if err := Unmarshal(testData[3], &r); err != nil { 262 b.Fatal("Unmarshal:", err) 263 } 264 } 265 b.SetBytes(int64(len(testData[3]))) 266 } 267 268 func BenchmarkUnmarshalString(b *testing.B) { 269 data := []byte(`"hello, world"`) 270 var s string 271 272 for i := 0; i < b.N; i++ { 273 if err := Unmarshal(data, &s); err != nil { 274 b.Fatal("Unmarshal:", err) 275 } 276 } 277 } 278 279 func BenchmarkUnmarshalFloat64(b *testing.B) { 280 var f float64 281 data := []byte(`3.14`) 282 283 for i := 0; i < b.N; i++ { 284 if err := Unmarshal(data, &f); err != nil { 285 b.Fatal("Unmarshal:", err) 286 } 287 } 288 } 289 290 func BenchmarkUnmarshalInt64(b *testing.B) { 291 var x int64 292 data := []byte(`3`) 293 294 for i := 0; i < b.N; i++ { 295 if err := Unmarshal(data, &x); err != nil { 296 b.Fatal("Unmarshal:", err) 297 } 298 } 299 } 300 301 func BenchmarkIssue10335(b *testing.B) { 302 b.ReportAllocs() 303 var s struct{} 304 j := []byte(`{"a":{ }}`) 305 for n := 0; n < b.N; n++ { 306 if err := Unmarshal(j, &s); err != nil { 307 b.Fatal(err) 308 } 309 } 310 }