...
1
2
3
4
5
6
7 package jsontext
8
9 import (
10 "bytes"
11 "io"
12 "math/bits"
13 "sync"
14 )
15
16
17
18 var (
19
20
21
22
23 bufferedEncoderPool = &sync.Pool{New: func() any { return new(Encoder) }}
24
25
26
27
28
29 streamingEncoderPool = &sync.Pool{New: func() any { return new(Encoder) }}
30
31
32
33 bytesBufferEncoderPool = &sync.Pool{New: func() any { return new(Encoder) }}
34 )
35
36
37
38
39 type bufferStatistics struct {
40 strikes int
41 prevLen int
42 }
43
44 func getBufferedEncoder(opts ...Options) *Encoder {
45 e := bufferedEncoderPool.Get().(*Encoder)
46 if e.s.Buf == nil {
47
48
49
50 n := 1 << bits.Len(uint(e.s.bufStats.prevLen|63))
51 e.s.Buf = make([]byte, 0, n)
52 }
53 e.s.reset(e.s.Buf[:0], nil, opts...)
54 return e
55 }
56 func putBufferedEncoder(e *Encoder) {
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 switch {
72 case cap(e.s.Buf) <= 4<<10:
73 e.s.bufStats.strikes = 0
74 case cap(e.s.Buf)/4 <= len(e.s.Buf):
75 e.s.bufStats.strikes = 0
76 case e.s.bufStats.strikes < 4:
77 e.s.bufStats.strikes++
78 default:
79 e.s.bufStats.strikes = 0
80 e.s.bufStats.prevLen = len(e.s.Buf)
81 e.s.Buf = nil
82 }
83 bufferedEncoderPool.Put(e)
84 }
85
86 func getStreamingEncoder(w io.Writer, opts ...Options) *Encoder {
87 if _, ok := w.(*bytes.Buffer); ok {
88 e := bytesBufferEncoderPool.Get().(*Encoder)
89 e.s.reset(nil, w, opts...)
90 return e
91 } else {
92 e := streamingEncoderPool.Get().(*Encoder)
93 e.s.reset(e.s.Buf[:0], w, opts...)
94 return e
95 }
96 }
97 func putStreamingEncoder(e *Encoder) {
98 if _, ok := e.s.wr.(*bytes.Buffer); ok {
99 bytesBufferEncoderPool.Put(e)
100 } else {
101 if cap(e.s.Buf) > 64<<10 {
102 e.s.Buf = nil
103 }
104 streamingEncoderPool.Put(e)
105 }
106 }
107
108 var (
109
110 bufferedDecoderPool = &sync.Pool{New: func() any { return new(Decoder) }}
111
112
113
114
115
116 streamingDecoderPool = &sync.Pool{New: func() any { return new(Decoder) }}
117
118
119
120 bytesBufferDecoderPool = bufferedDecoderPool
121 )
122
123 func getBufferedDecoder(b []byte, opts ...Options) *Decoder {
124 d := bufferedDecoderPool.Get().(*Decoder)
125 d.s.reset(b, nil, opts...)
126 return d
127 }
128 func putBufferedDecoder(d *Decoder) {
129 bufferedDecoderPool.Put(d)
130 }
131
132 func getStreamingDecoder(r io.Reader, opts ...Options) *Decoder {
133 if _, ok := r.(*bytes.Buffer); ok {
134 d := bytesBufferDecoderPool.Get().(*Decoder)
135 d.s.reset(nil, r, opts...)
136 return d
137 } else {
138 d := streamingDecoderPool.Get().(*Decoder)
139 d.s.reset(d.s.buf[:0], r, opts...)
140 return d
141 }
142 }
143 func putStreamingDecoder(d *Decoder) {
144 if _, ok := d.s.rd.(*bytes.Buffer); ok {
145 bytesBufferDecoderPool.Put(d)
146 } else {
147 if cap(d.s.buf) > 64<<10 {
148 d.s.buf = nil
149 }
150 streamingDecoderPool.Put(d)
151 }
152 }
153
View as plain text