github.com/goshafaq/sonic@v0.0.0-20231026082336-871835fb94c6/internal/encoder/stream_test.go (about) 1 /* 2 * Copyright 2021 ByteDance Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package encoder 18 19 import ( 20 "bytes" 21 "encoding/json" 22 "strings" 23 "testing" 24 25 "github.com/stretchr/testify/require" 26 ) 27 28 func TestEncodeStream(t *testing.T) { 29 var o = map[string]interface{}{ 30 "a": "<>", 31 "b": json.RawMessage(" [ ] "), 32 } 33 var w1 = bytes.NewBuffer(nil) 34 var w2 = bytes.NewBuffer(nil) 35 var enc1 = json.NewEncoder(w1) 36 var enc2 = NewStreamEncoder(w2) 37 enc2.SetEscapeHTML(true) 38 enc2.SortKeys() 39 enc2.SetCompactMarshaler(true) 40 41 require.Nil(t, enc1.Encode(o)) 42 require.Nil(t, enc2.Encode(o)) 43 require.Equal(t, w1.String(), w2.String()) 44 45 enc1.SetEscapeHTML(true) 46 enc2.SetEscapeHTML(true) 47 enc1.SetIndent("你好", "\b") 48 enc2.SetIndent("你好", "\b") 49 require.Nil(t, enc1.Encode(o)) 50 require.Nil(t, enc2.Encode(o)) 51 require.Equal(t, w1.String(), w2.String()) 52 53 enc1.SetEscapeHTML(false) 54 enc2.SetEscapeHTML(false) 55 enc1.SetIndent("", "") 56 enc2.SetIndent("", "") 57 require.Nil(t, enc1.Encode(o)) 58 require.Nil(t, enc2.Encode(o)) 59 require.Equal(t, w1.String(), w2.String()) 60 } 61 62 func BenchmarkEncodeStream_Sonic(b *testing.B) { 63 var o = map[string]interface{}{ 64 "a": `<` + strings.Repeat("1", 1024) + `>`, 65 "b": json.RawMessage(` [ ` + strings.Repeat(" ", 1024) + ` ] `), 66 } 67 68 b.Run("single", func(b *testing.B) { 69 var w = bytes.NewBuffer(nil) 70 var enc = NewStreamEncoder(w) 71 b.ResetTimer() 72 for i := 0; i < b.N; i++ { 73 _ = enc.Encode(o) 74 w.Reset() 75 } 76 }) 77 78 b.Run("double", func(b *testing.B) { 79 var w = bytes.NewBuffer(nil) 80 var enc = NewStreamEncoder(w) 81 b.ResetTimer() 82 for i := 0; i < b.N; i++ { 83 _ = enc.Encode(o) 84 _ = enc.Encode(o) 85 w.Reset() 86 } 87 }) 88 89 b.Run("compatible", func(b *testing.B) { 90 var w = bytes.NewBuffer(nil) 91 var enc = NewStreamEncoder(w) 92 enc.SetEscapeHTML(true) 93 enc.SortKeys() 94 enc.SetCompactMarshaler(true) 95 b.ResetTimer() 96 for i := 0; i < b.N; i++ { 97 _ = enc.Encode(o) 98 w.Reset() 99 } 100 }) 101 } 102 103 func BenchmarkEncodeStream_Std(b *testing.B) { 104 var o = map[string]interface{}{ 105 "a": `<` + strings.Repeat("1", 1024) + `>`, 106 "b": json.RawMessage(` [ ` + strings.Repeat(" ", 1024) + ` ] `), 107 } 108 109 b.Run("single", func(b *testing.B) { 110 var w = bytes.NewBuffer(nil) 111 var enc = json.NewEncoder(w) 112 b.ResetTimer() 113 for i := 0; i < b.N; i++ { 114 _ = enc.Encode(o) 115 w.Reset() 116 } 117 }) 118 119 b.Run("double", func(b *testing.B) { 120 var w = bytes.NewBuffer(nil) 121 var enc = json.NewEncoder(w) 122 b.ResetTimer() 123 for i := 0; i < b.N; i++ { 124 _ = enc.Encode(o) 125 _ = enc.Encode(o) 126 w.Reset() 127 } 128 }) 129 130 b.Run("compatible", func(b *testing.B) { 131 var w = bytes.NewBuffer(nil) 132 var enc = json.NewEncoder(w) 133 enc.SetEscapeHTML(true) 134 b.ResetTimer() 135 for i := 0; i < b.N; i++ { 136 _ = enc.Encode(o) 137 w.Reset() 138 } 139 }) 140 }