bench_test.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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. // Large data benchmark.
  5. // The JSON data is a summary of agl's changes in the
  6. // go, webkit, and chromium open source projects.
  7. // We benchmark converting between the JSON form
  8. // and in-memory data structures.
  9. package json
  10. import (
  11. "bytes"
  12. "compress/gzip"
  13. "io/ioutil"
  14. "os"
  15. "testing"
  16. )
  17. type codeResponse struct {
  18. Tree *codeNode `json:"tree"`
  19. Username string `json:"username"`
  20. }
  21. type codeNode struct {
  22. Name string `json:"name"`
  23. Kids []*codeNode `json:"kids"`
  24. CLWeight float64 `json:"cl_weight"`
  25. Touches int `json:"touches"`
  26. MinT int64 `json:"min_t"`
  27. MaxT int64 `json:"max_t"`
  28. MeanT int64 `json:"mean_t"`
  29. }
  30. var codeJSON []byte
  31. var codeStruct codeResponse
  32. func codeInit() {
  33. f, err := os.Open("testdata/code.json.gz")
  34. if err != nil {
  35. panic(err)
  36. }
  37. defer f.Close()
  38. gz, err := gzip.NewReader(f)
  39. if err != nil {
  40. panic(err)
  41. }
  42. data, err := ioutil.ReadAll(gz)
  43. if err != nil {
  44. panic(err)
  45. }
  46. codeJSON = data
  47. if err := Unmarshal(codeJSON, &codeStruct); err != nil {
  48. panic("unmarshal code.json: " + err.Error())
  49. }
  50. if data, err = Marshal(&codeStruct); err != nil {
  51. panic("marshal code.json: " + err.Error())
  52. }
  53. if !bytes.Equal(data, codeJSON) {
  54. println("different lengths", len(data), len(codeJSON))
  55. for i := 0; i < len(data) && i < len(codeJSON); i++ {
  56. if data[i] != codeJSON[i] {
  57. println("re-marshal: changed at byte", i)
  58. println("orig: ", string(codeJSON[i-10:i+10]))
  59. println("new: ", string(data[i-10:i+10]))
  60. break
  61. }
  62. }
  63. panic("re-marshal code.json: different result")
  64. }
  65. }
  66. func BenchmarkCodeEncoder(b *testing.B) {
  67. if codeJSON == nil {
  68. b.StopTimer()
  69. codeInit()
  70. b.StartTimer()
  71. }
  72. enc := NewEncoder(ioutil.Discard)
  73. for i := 0; i < b.N; i++ {
  74. if err := enc.Encode(&codeStruct); err != nil {
  75. b.Fatal("Encode:", err)
  76. }
  77. }
  78. b.SetBytes(int64(len(codeJSON)))
  79. }
  80. func BenchmarkCodeMarshal(b *testing.B) {
  81. if codeJSON == nil {
  82. b.StopTimer()
  83. codeInit()
  84. b.StartTimer()
  85. }
  86. for i := 0; i < b.N; i++ {
  87. if _, err := Marshal(&codeStruct); err != nil {
  88. b.Fatal("Marshal:", err)
  89. }
  90. }
  91. b.SetBytes(int64(len(codeJSON)))
  92. }
  93. func BenchmarkCodeDecoder(b *testing.B) {
  94. if codeJSON == nil {
  95. b.StopTimer()
  96. codeInit()
  97. b.StartTimer()
  98. }
  99. var buf bytes.Buffer
  100. dec := NewDecoder(&buf)
  101. var r codeResponse
  102. for i := 0; i < b.N; i++ {
  103. buf.Write(codeJSON)
  104. // hide EOF
  105. buf.WriteByte('\n')
  106. buf.WriteByte('\n')
  107. buf.WriteByte('\n')
  108. if err := dec.Decode(&r); err != nil {
  109. b.Fatal("Decode:", err)
  110. }
  111. }
  112. b.SetBytes(int64(len(codeJSON)))
  113. }
  114. func BenchmarkCodeUnmarshal(b *testing.B) {
  115. if codeJSON == nil {
  116. b.StopTimer()
  117. codeInit()
  118. b.StartTimer()
  119. }
  120. for i := 0; i < b.N; i++ {
  121. var r codeResponse
  122. if err := Unmarshal(codeJSON, &r); err != nil {
  123. b.Fatal("Unmmarshal:", err)
  124. }
  125. }
  126. b.SetBytes(int64(len(codeJSON)))
  127. }
  128. func BenchmarkCodeUnmarshalReuse(b *testing.B) {
  129. if codeJSON == nil {
  130. b.StopTimer()
  131. codeInit()
  132. b.StartTimer()
  133. }
  134. var r codeResponse
  135. for i := 0; i < b.N; i++ {
  136. if err := Unmarshal(codeJSON, &r); err != nil {
  137. b.Fatal("Unmmarshal:", err)
  138. }
  139. }
  140. }
  141. func BenchmarkUnmarshalString(b *testing.B) {
  142. data := []byte(`"hello, world"`)
  143. var s string
  144. for i := 0; i < b.N; i++ {
  145. if err := Unmarshal(data, &s); err != nil {
  146. b.Fatal("Unmarshal:", err)
  147. }
  148. }
  149. }
  150. func BenchmarkUnmarshalFloat64(b *testing.B) {
  151. var f float64
  152. data := []byte(`3.14`)
  153. for i := 0; i < b.N; i++ {
  154. if err := Unmarshal(data, &f); err != nil {
  155. b.Fatal("Unmarshal:", err)
  156. }
  157. }
  158. }
  159. func BenchmarkUnmarshalInt64(b *testing.B) {
  160. var x int64
  161. data := []byte(`3`)
  162. for i := 0; i < b.N; i++ {
  163. if err := Unmarshal(data, &x); err != nil {
  164. b.Fatal("Unmarshal:", err)
  165. }
  166. }
  167. }