...

Source file src/github.com/launchdarkly/go-jsonstream/v3/jreader/reader_benchmark_test.go

Documentation: github.com/launchdarkly/go-jsonstream/v3/jreader

     1  package jreader
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/launchdarkly/go-jsonstream/v3/internal/commontest"
     7  )
     8  
     9  func BenchmarkReadNullNoAlloc(b *testing.B) {
    10  	data := []byte("null")
    11  	b.ResetTimer()
    12  	for i := 0; i < b.N; i++ {
    13  		r := NewReader(data)
    14  		if err := r.Null(); err != nil {
    15  			b.FailNow()
    16  		}
    17  	}
    18  }
    19  
    20  func BenchmarkReadBooleanNoAlloc(b *testing.B) {
    21  	data := []byte("true")
    22  	b.ResetTimer()
    23  	for i := 0; i < b.N; i++ {
    24  		r := NewReader(data)
    25  		val := r.Bool()
    26  		if !val || r.Error() != nil {
    27  			b.FailNow()
    28  		}
    29  	}
    30  }
    31  
    32  func BenchmarkReadNumberIntNoAlloc(b *testing.B) {
    33  	data := []byte("1234")
    34  	b.ResetTimer()
    35  	for i := 0; i < b.N; i++ {
    36  		r := NewReader(data)
    37  		val := r.Int()
    38  		failBenchmarkOnReaderError(b, &r)
    39  		if val != 1234 {
    40  			b.FailNow()
    41  		}
    42  	}
    43  }
    44  
    45  func BenchmarkReadNumberFloat(b *testing.B) {
    46  	data := []byte("1234.5")
    47  	b.ResetTimer()
    48  	for i := 0; i < b.N; i++ {
    49  		r := NewReader(data)
    50  		val := r.Float64()
    51  		failBenchmarkOnReaderError(b, &r)
    52  		if val != 1234.5 {
    53  			b.FailNow()
    54  		}
    55  	}
    56  }
    57  
    58  func BenchmarkReadString(b *testing.B) {
    59  	data := []byte(`"abc"`)
    60  	b.ResetTimer()
    61  	for i := 0; i < b.N; i++ {
    62  		r := NewReader(data)
    63  		val := r.String()
    64  		failBenchmarkOnReaderError(b, &r)
    65  		if val != "abc" {
    66  			b.FailNow()
    67  		}
    68  	}
    69  }
    70  
    71  func BenchmarkReadArrayOfBools(b *testing.B) {
    72  	expected := commontest.MakeBools()
    73  	data := commontest.MakeBoolsJSON(expected)
    74  	b.ResetTimer()
    75  	for i := 0; i < b.N; i++ {
    76  		var vals []bool
    77  		r := NewReader(data)
    78  		arr := r.Array()
    79  		failBenchmarkOnReaderError(b, &r)
    80  		for arr.Next() {
    81  			val := r.Bool()
    82  			failBenchmarkOnReaderError(b, &r)
    83  			vals = append(vals, val)
    84  		}
    85  		if len(vals) < len(expected) {
    86  			b.FailNow()
    87  		}
    88  	}
    89  }
    90  
    91  func BenchmarkReadArrayOfStrings(b *testing.B) {
    92  	expected := commontest.MakeStrings()
    93  	data := commontest.MakeStringsJSON(expected)
    94  	b.ResetTimer()
    95  	for i := 0; i < b.N; i++ {
    96  		var vals []string
    97  		r := NewReader(data)
    98  		arr := r.Array()
    99  		failBenchmarkOnReaderError(b, &r)
   100  		for arr.Next() {
   101  			val := r.String()
   102  			failBenchmarkOnReaderError(b, &r)
   103  			vals = append(vals, val)
   104  		}
   105  		if len(vals) < len(expected) {
   106  			b.FailNow()
   107  		}
   108  	}
   109  }
   110  
   111  func BenchmarkReadArrayOfNullsNoAlloc(b *testing.B) {
   112  	// This just verifies that simply parsing an array doesn't cause any allocations, if the values don't.
   113  	data := []byte(`[null,null]`)
   114  	b.ResetTimer()
   115  	for i := 0; i < b.N; i++ {
   116  		r := NewReader(data)
   117  		arr := r.Array()
   118  		failBenchmarkOnReaderError(b, &r)
   119  		if !arr.Next() {
   120  			b.FailNow()
   121  		}
   122  		if err := r.Null(); err != nil {
   123  			b.FailNow()
   124  		}
   125  		if !arr.Next() {
   126  			b.FailNow()
   127  		}
   128  		failBenchmarkOnReaderError(b, &r)
   129  		if arr.Next() {
   130  			b.FailNow()
   131  		}
   132  	}
   133  }
   134  
   135  func BenchmarkReadObjectNoAlloc(b *testing.B) {
   136  	for i := 0; i < b.N; i++ {
   137  		var val ExampleStructWrapper
   138  		r := NewReader(commontest.ExampleStructData)
   139  		val.ReadFromJSONReader(&r)
   140  		failBenchmarkOnReaderError(b, &r)
   141  		if val != ExampleStructWrapper(commontest.ExampleStructValue) {
   142  			b.FailNow()
   143  		}
   144  	}
   145  }
   146  
   147  func BenchmarkReadArrayOfObjects(b *testing.B) {
   148  	rawStructs := commontest.MakeStructs()
   149  	data := commontest.MakeStructsJSON(rawStructs)
   150  	var expected []ExampleStructWrapper
   151  	for _, rawStruct := range rawStructs {
   152  		expected = append(expected, ExampleStructWrapper(rawStruct))
   153  	}
   154  	b.ResetTimer()
   155  	for i := 0; i < b.N; i++ {
   156  		values := make([]ExampleStructWrapper, 0)
   157  		r := NewReader(data)
   158  		for arr := r.Array(); arr.Next(); {
   159  			var val ExampleStructWrapper
   160  			val.ReadFromJSONReader(&r)
   161  			values = append(values, val)
   162  		}
   163  		failBenchmarkOnReaderError(b, &r)
   164  		for i, val := range values {
   165  			if val != expected[i] {
   166  				b.FailNow()
   167  			}
   168  		}
   169  	}
   170  }
   171  
   172  func BenchmarkReadObjectWithRequiredPropsNoAlloc(b *testing.B) {
   173  	for i := 0; i < b.N; i++ {
   174  		var val ExampleStructWrapperWithRequiredProps
   175  		r := NewReader(commontest.ExampleStructData)
   176  		val.ReadFromJSONReader(&r)
   177  		failBenchmarkOnReaderError(b, &r)
   178  		if val != ExampleStructWrapperWithRequiredProps(commontest.ExampleStructValue) {
   179  			b.FailNow()
   180  		}
   181  	}
   182  }
   183  
   184  func failBenchmarkOnReaderError(b *testing.B, r *Reader) {
   185  	if r.Error() != nil {
   186  		b.Error(r.Error())
   187  		b.FailNow()
   188  	}
   189  }
   190  

View as plain text