소스 검색

codec: use decReader and encWriter interfaces (not the struct decReaderSwitch/encWriterSwitch)

The performance advantages of mid-stack inlining do not become default
until go 1.12 (to be released in Feb 2019). At that time, we can revisit
the alternative to take advantage of better inlining sans interfaces.
Ugorji Nwoke 7 년 전
부모
커밋
0a18df59e4
8개의 변경된 파일41개의 추가작업 그리고 38개의 파일을 삭제
  1. 2 4
      codec/binc.go
  2. 4 6
      codec/cbor.go
  3. 11 6
      codec/decode.go
  4. 10 8
      codec/encode.go
  5. 1 1
      codec/helper.go
  6. 9 9
      codec/json.go
  7. 2 2
      codec/msgpack.go
  8. 2 2
      codec/simple.go

+ 2 - 4
codec/binc.go

@@ -102,7 +102,7 @@ func bincdesc(vd, vs byte) string {
 type bincEncDriver struct {
 	e *Encoder
 	h *BincHandle
-	w *encWriterSwitch
+	w encWriter
 	m map[string]uint16 // symbols
 	b [16]byte          // scratch, used for encoding numbers - bigendian style
 	s uint16            // symbols sequencer
@@ -110,7 +110,6 @@ type bincEncDriver struct {
 	encDriverTrackContainerWriter
 	noBuiltInTypes
 	// encNoSeparator
-	_ [1]uint64 // padding
 }
 
 func (e *bincEncDriver) EncodeNil() {
@@ -378,7 +377,7 @@ type bincDecDriver struct {
 
 	d      *Decoder
 	h      *BincHandle
-	r      *decReaderSwitch
+	r      decReader
 	br     bool // bytes reader
 	bdRead bool
 	bd     byte
@@ -393,7 +392,6 @@ type bincDecDriver struct {
 	// decNoSeparator
 
 	b [8 * 8]byte // scratch
-	_ [1]uint64   // padding
 }
 
 func (d *bincDecDriver) readNextBd() {

+ 4 - 6
codec/cbor.go

@@ -105,9 +105,8 @@ func cbordesc(bd byte) string {
 type cborEncDriver struct {
 	noBuiltInTypes
 	encDriverNoopContainerWriter
-	// encNoSeparator
 	e *Encoder
-	w *encWriterSwitch
+	w encWriter
 	h *CborHandle
 	x [8]byte
 	// _ [3]uint64 // padding
@@ -285,10 +284,9 @@ func (e *cborEncDriver) encStringBytesS(bb byte, v string) {
 // ----------------------
 
 type cborDecDriver struct {
-	d *Decoder
-	h *CborHandle
-	r *decReaderSwitch
-	// b      [scratchByteArrayLen]byte
+	d      *Decoder
+	h      *CborHandle
+	r      decReader
 	br     bool // bytes reader
 	bdRead bool
 	bd     byte

+ 11 - 6
codec/decode.go

@@ -1745,6 +1745,8 @@ type decReaderSwitch struct {
 	bufio bool // is this a bufioDecReader?
 }
 
+/*
+
 func (z *decReaderSwitch) unreadn1() {
 	if z.bytes {
 		z.rb.unreadn1()
@@ -1829,6 +1831,8 @@ func (z *decReaderSwitch) readUntil(in []byte, stop byte) (out []byte) {
 	return z.ri.readUntil(in, stop)
 }
 
+*/
+
 // A Decoder reads and decodes an object from an input stream in the codec format.
 type Decoder struct {
 	panicHdl
@@ -1838,8 +1842,7 @@ type Decoder struct {
 	d decDriver
 	// NOTE: Decoder shouldn't call it's read methods,
 	// as the handler MAY need to do some coordination.
-	r *decReaderSwitch // formerly decReader
-	h *BasicHandle
+	r decReader
 	// bi *bufioDecReader
 	// cache the mapTypeId and sliceTypeId for faster comparisons
 	mtid uintptr
@@ -1856,6 +1859,7 @@ type Decoder struct {
 	// cr containerStateRecv
 	err error
 
+	h *BasicHandle
 	_ [1]uint64 // padding
 
 	// ---- cpu cache line boundary?
@@ -1906,7 +1910,7 @@ func newDecoder(h Handle) *Decoder {
 }
 
 func (d *Decoder) resetCommon() {
-	d.r = &d.decReaderSwitch
+	// d.r = &d.decReaderSwitch
 	d.n.reset()
 	d.d.reset()
 	d.err = nil
@@ -1940,6 +1944,7 @@ func (d *Decoder) Reset(r io.Reader) {
 			d.bi.buf = d.bi.buf[:0]
 		}
 		d.bi.reset(r)
+		d.r = d.bi
 		d.bufio = true
 	} else {
 		// d.ri.x = &d.b
@@ -1948,7 +1953,7 @@ func (d *Decoder) Reset(r io.Reader) {
 			d.ri = new(ioDecReader)
 		}
 		d.ri.reset(r)
-		// d.r = d.ri
+		d.r = d.ri
 		d.bufio = false
 	}
 	d.resetCommon()
@@ -1962,7 +1967,7 @@ func (d *Decoder) ResetBytes(in []byte) {
 	}
 	d.bytes = true
 	d.rb.reset(in)
-	// d.r = &d.rb
+	d.r = &d.rb
 	d.resetCommon()
 }
 
@@ -2462,7 +2467,7 @@ func (x decSliceHelper) ElemContainerState(index int) {
 	}
 }
 
-func decByteSlice(r *decReaderSwitch, clen, maxInitLen int, bs []byte) (bsOut []byte) {
+func decByteSlice(r decReader, clen, maxInitLen int, bs []byte) (bsOut []byte) {
 	if clen == 0 {
 		return zeroByteSlice
 	}

+ 10 - 8
codec/encode.go

@@ -897,8 +897,7 @@ func (e *Encoder) kMapCanonical(rtkey reflect.Type, rv reflect.Value, mks []refl
 // // --------------------------------------------------
 
 type encWriterSwitch struct {
-	wi *ioEncWriter
-	// wb bytesEncWriter
+	wi   *ioEncWriter
 	wb   bytesEncAppender
 	wx   bool      // if bytes, wx=true
 	esep bool      // whether it has elem separators
@@ -909,6 +908,8 @@ type encWriterSwitch struct {
 	_    [2]uint64 // padding
 }
 
+/*
+
 func (z *encWriterSwitch) writeb(s []byte) {
 	if z.wx {
 		z.wb.writeb(s)
@@ -945,6 +946,8 @@ func (z *encWriterSwitch) atEndOfEncode() {
 	}
 }
 
+*/
+
 // An Encoder writes an object to an output stream in the codec format.
 type Encoder struct {
 	panicHdl
@@ -952,9 +955,8 @@ type Encoder struct {
 	e encDriver
 	// NOTE: Encoder shouldn't call it's write methods,
 	// as the handler MAY need to do some coordination.
-	w *encWriterSwitch // formerly encWriter
+	w encWriter
 
-	h *BasicHandle
 	// bw *bufio.Writer
 	as encDriverAsis
 
@@ -964,6 +966,7 @@ type Encoder struct {
 	encWriterSwitch
 
 	// ---- cpu cache line boundary?
+	h *BasicHandle
 	codecFnPooler
 	ci set
 
@@ -973,7 +976,6 @@ type Encoder struct {
 	// b [scratchByteArrayLen]byte
 	// _ [cacheLineSize - scratchByteArrayLen]byte // padding
 	b [cacheLineSize - 0]byte // used for encoding a chan or (non-addressable) array of bytes
-	_ [1]uint64               // padding
 }
 
 // NewEncoder returns an Encoder for encoding into an io.Writer.
@@ -1005,7 +1007,7 @@ func newEncoder(h Handle) *Encoder {
 }
 
 func (e *Encoder) resetCommon() {
-	e.w = &e.encWriterSwitch
+	// e.w = &e.encWriterSwitch
 	if e.e == nil || e.hh.recreateEncDriver(e.e) {
 		e.e = e.hh.newEncDriver(e)
 		e.as, e.isas = e.e.(encDriverAsis)
@@ -1047,7 +1049,7 @@ func (e *Encoder) Reset(w io.Writer) {
 		e.wi.fw, _ = w.(ioFlusher)
 		e.wi.ww = w
 	}
-	// e.w = e.wi
+	e.w = e.wi
 	e.resetCommon()
 }
 
@@ -1065,7 +1067,7 @@ func (e *Encoder) ResetBytes(out *[]byte) {
 	}
 	e.wx = true
 	e.wb.reset(in, out)
-	// e.w = &e.wb
+	e.w = &e.wb
 	e.resetCommon()
 }
 

+ 1 - 1
codec/helper.go

@@ -628,7 +628,7 @@ func (noElemSeparators) recreateEncDriver(e encDriver) (v bool) { return }
 // Users must already slice the x completely, because we will not reslice.
 type bigenHelper struct {
 	x []byte // must be correctly sliced to appropriate len. slicing is a cost.
-	w *encWriterSwitch
+	w encWriter
 }
 
 func (z bigenHelper) writeUint16(v uint16) {

+ 9 - 9
codec/json.go

@@ -115,7 +115,7 @@ func init() {
 // ----------------
 
 type jsonEncDriverTypical struct {
-	w  *encWriterSwitch
+	w  encWriter
 	b  *[jsonScratchArrayLen]byte
 	tw bool // term white space
 	c  containerState
@@ -125,7 +125,6 @@ func (e *jsonEncDriverTypical) typical() {}
 
 func (e *jsonEncDriverTypical) reset(ee *jsonEncDriver) {
 	e.w = ee.ew
-	// e.w = &ee.e.encWriterSwitch
 	e.b = &ee.b
 	e.tw = ee.h.TermWhitespace
 	e.c = 0
@@ -204,7 +203,7 @@ func (e *jsonEncDriverTypical) atEndOfEncode() {
 // ----------------
 
 type jsonEncDriverGeneric struct {
-	w *encWriterSwitch
+	w encWriter
 	b *[jsonScratchArrayLen]byte
 	c containerState
 	// ds string // indent string
@@ -406,7 +405,7 @@ type jsonEncDriver struct {
 	noBuiltInTypes
 	e  *Encoder
 	h  *JsonHandle
-	ew *encWriterSwitch
+	ew encWriter
 	se extWrapper
 	// ---- cpu cache line boundary?
 	bs []byte // scratch
@@ -569,7 +568,7 @@ type jsonDecDriver struct {
 	noBuiltInTypes
 	d  *Decoder
 	h  *JsonHandle
-	r  *decReaderSwitch // decReader
+	r  decReader
 	se extWrapper
 
 	// ---- writable fields during execution --- *try* to keep in sep cache line
@@ -584,7 +583,7 @@ type jsonDecDriver struct {
 	b  [jsonScratchArrayLen]byte // scratch 1, used for parsing strings or numbers or time.Time
 	b2 [jsonScratchArrayLen]byte // scratch 2, used only for readUntil, decNumBytes
 
-	// _ [3]uint64 // padding
+	_ [3]uint64 // padding
 	// n jsonNum
 }
 
@@ -1321,7 +1320,7 @@ func (h *JsonHandle) SetInterfaceExt(rt reflect.Type, tag uint64, ext InterfaceE
 type jsonEncDriverTypicalImpl struct {
 	jsonEncDriver
 	jsonEncDriverTypical
-	_ [1]uint64 // padding
+	_ [3]uint64 // padding
 }
 
 func (x *jsonEncDriverTypicalImpl) reset() {
@@ -1332,6 +1331,7 @@ func (x *jsonEncDriverTypicalImpl) reset() {
 type jsonEncDriverGenericImpl struct {
 	jsonEncDriver
 	jsonEncDriverGeneric
+	_ [2]uint64 // padding
 }
 
 func (x *jsonEncDriverGenericImpl) reset() {
@@ -1366,7 +1366,7 @@ func (h *JsonHandle) newDecDriver(d *Decoder) decDriver {
 }
 
 func (e *jsonEncDriver) reset() {
-	e.ew = e.e.w // e.e.w // &e.e.encWriterSwitch
+	e.ew = e.e.w
 	e.se.InterfaceExt = e.h.RawBytesExt
 	if e.bs != nil {
 		e.bs = e.bs[:0]
@@ -1374,7 +1374,7 @@ func (e *jsonEncDriver) reset() {
 }
 
 func (d *jsonDecDriver) reset() {
-	d.r = d.d.r // &d.d.decReaderSwitch // d.d.r
+	d.r = d.d.r
 	d.se.InterfaceExt = d.h.RawBytesExt
 	if d.bs != nil {
 		d.bs = d.bs[:0]

+ 2 - 2
codec/msgpack.go

@@ -199,7 +199,7 @@ type msgpackEncDriver struct {
 	encDriverNoopContainerWriter
 	// encNoSeparator
 	e *Encoder
-	w *encWriterSwitch
+	w encWriter
 	h *MsgpackHandle
 	x [8]byte
 	// _ [3]uint64 // padding
@@ -414,7 +414,7 @@ func (e *msgpackEncDriver) writeContainerLen(ct msgpackContainerType, l int) {
 
 type msgpackDecDriver struct {
 	d *Decoder
-	r *decReaderSwitch
+	r decReader
 	h *MsgpackHandle
 	// b      [scratchByteArrayLen]byte
 	bd     byte

+ 2 - 2
codec/simple.go

@@ -36,7 +36,7 @@ type simpleEncDriver struct {
 	// encNoSeparator
 	e *Encoder
 	h *SimpleHandle
-	w *encWriterSwitch
+	w encWriter
 	b [8]byte
 	// c containerState
 	encDriverTrackContainerWriter
@@ -201,7 +201,7 @@ func (e *simpleEncDriver) EncodeTime(t time.Time) {
 type simpleDecDriver struct {
 	d      *Decoder
 	h      *SimpleHandle
-	r      *decReaderSwitch
+	r      decReader
 	bdRead bool
 	bd     byte
 	br     bool // a bytes reader?