Browse Source

codec: improve decode performance by calling ReadByte if Reader is io.ByteReader, and other misc optimizations.

Also include other misc optimizations and clean up of comments.

Improves RPC performance as seen in #9 .
Ugorji Nwoke 12 years ago
parent
commit
5a8bee99a9
3 changed files with 12 additions and 28 deletions
  1. 0 8
      codec/binc.go
  2. 12 3
      codec/decode.go
  3. 0 17
      codec/encode.go

+ 0 - 8
codec/binc.go

@@ -126,7 +126,6 @@ func (e *bincEncDriver) encodeBool(b bool) {
 }
 }
 
 
 func (e *bincEncDriver) encodeFloat32(f float32) {
 func (e *bincEncDriver) encodeFloat32(f float32) {
-	//println("encodeFloat32")
 	if f == 0 {
 	if f == 0 {
 		e.w.writen1(bincVdSpecial<<4 | bincSpZeroFloat)
 		e.w.writen1(bincVdSpecial<<4 | bincSpZeroFloat)
 		return
 		return
@@ -387,15 +386,12 @@ func (d *bincDecDriver) decFloatPre(vs, defaultLen byte) {
 }
 }
 
 
 func (d *bincDecDriver) decFloat() (f float64) {
 func (d *bincDecDriver) decFloat() (f float64) {
-	//println("decFloat")
 	//if true { f = math.Float64frombits(d.r.readUint64()); break; }
 	//if true { f = math.Float64frombits(d.r.readUint64()); break; }
 	switch vs := d.vs; vs & 0x7 {
 	switch vs := d.vs; vs & 0x7 {
 	case bincFlBin32:
 	case bincFlBin32:
-		//println("decodeFloat32")
 		d.decFloatPre(vs, 4)
 		d.decFloatPre(vs, 4)
 		f = float64(math.Float32frombits(bigen.Uint32(d.b[0:4])))
 		f = float64(math.Float32frombits(bigen.Uint32(d.b[0:4])))
 	case bincFlBin64:
 	case bincFlBin64:
-		//println("decodeFloat64")
 		d.decFloatPre(vs, 8)
 		d.decFloatPre(vs, 8)
 		f = math.Float64frombits(bigen.Uint64(d.b[0:8]))
 		f = math.Float64frombits(bigen.Uint64(d.b[0:8]))
 	default:
 	default:
@@ -629,7 +625,6 @@ func (d *bincDecDriver) decodeString() (s string) {
 		} else {
 		} else {
 			symbol = d.r.readUint16()
 			symbol = d.r.readUint16()
 		}
 		}
-		//println(">>>> symbol: ", symbol)
 		if d.m == nil {
 		if d.m == nil {
 			d.m = make(map[uint16]string, 16)
 			d.m = make(map[uint16]string, 16)
 		}
 		}
@@ -637,7 +632,6 @@ func (d *bincDecDriver) decodeString() (s string) {
 		if vs&0x4 == 0 {
 		if vs&0x4 == 0 {
 			s = d.m[symbol]
 			s = d.m[symbol]
 		} else {
 		} else {
-			//println(">>>> will store symbol")
 			var slen int
 			var slen int
 			switch vs & 0x3 {
 			switch vs & 0x3 {
 			case 0:
 			case 0:
@@ -649,9 +643,7 @@ func (d *bincDecDriver) decodeString() (s string) {
 			case 3:
 			case 3:
 				slen = int(d.r.readUint64())
 				slen = int(d.r.readUint64())
 			}
 			}
-			//println(">>>> symbol len: ", slen)
 			s = string(d.r.readn(slen))
 			s = string(d.r.readn(slen))
-			//println(">>>> storing symbol: ", symbol, ", string value: ", s)
 			d.m[symbol] = s
 			d.m[symbol] = s
 		}
 		}
 	default:
 	default:

+ 12 - 3
codec/decode.go

@@ -63,6 +63,7 @@ type Decoder struct {
 // ioDecReader is a decReader that reads off an io.Reader
 // ioDecReader is a decReader that reads off an io.Reader
 type ioDecReader struct {
 type ioDecReader struct {
 	r io.Reader
 	r io.Reader
+	br io.ByteReader
 	x [8]byte //temp byte array re-used internally for efficiency
 	x [8]byte //temp byte array re-used internally for efficiency
 }
 }
 
 
@@ -179,6 +180,7 @@ func NewDecoder(r io.Reader, h Handle) *Decoder {
 	z := ioDecReader{
 	z := ioDecReader{
 		r: r,
 		r: r,
 	}
 	}
+	z.br, _ = r.(io.ByteReader)
 	return &Decoder{r: &z, d: h.newDecDriver(&z), h: h}
 	return &Decoder{r: &z, d: h.newDecDriver(&z), h: h}
 }
 }
 
 
@@ -527,19 +529,26 @@ func (d *Decoder) chkPtrValue(rv reflect.Value) {
 
 
 func (z *ioDecReader) readn(n int) (bs []byte) {
 func (z *ioDecReader) readn(n int) (bs []byte) {
 	bs = make([]byte, n)
 	bs = make([]byte, n)
-	if _, err := io.ReadFull(z.r, bs); err != nil {
+	if _, err := io.ReadAtLeast(z.r, bs, n); err != nil {
 		panic(err)
 		panic(err)
 	}
 	}
 	return
 	return
 }
 }
 
 
-func (z *ioDecReader) readb(bs []byte) {
-	if _, err := io.ReadFull(z.r, bs); err != nil {
+func (z *ioDecReader) readb(bs []byte) {	
+	if _, err := io.ReadAtLeast(z.r, bs, len(bs)); err != nil {
 		panic(err)
 		panic(err)
 	}
 	}
 }
 }
 
 
 func (z *ioDecReader) readn1() uint8 {
 func (z *ioDecReader) readn1() uint8 {
+	if z.br != nil {
+		b, err := z.br.ReadByte()
+		if err != nil {
+			panic(err)
+		}
+		return b
+	}
 	z.readb(z.x[:1])
 	z.readb(z.x[:1])
 	return z.x[0]
 	return z.x[0]
 }
 }

+ 0 - 17
codec/encode.go

@@ -27,8 +27,6 @@ type encWriter interface {
 	writestr(string)
 	writestr(string)
 	writen1(byte)
 	writen1(byte)
 	writen2(byte, byte)
 	writen2(byte, byte)
-	//writen3(byte, byte, byte)
-	//writen4(byte, byte, byte, byte)
 	atEndOfEncode()
 	atEndOfEncode()
 }
 }
 
 
@@ -557,21 +555,6 @@ func (z *bytesEncWriter) writen2(b1 byte, b2 byte) {
 	z.b[c+1] = b2
 	z.b[c+1] = b2
 }
 }
 
 
-// func (z *bytesEncWriter) writen3(b1 byte, b2 byte, b3 byte) {
-// 	c := z.grow(3)
-// 	z.b[c] = b1
-// 	z.b[c+1] = b2
-// 	z.b[c+2] = b3
-// }
-
-// func (z *bytesEncWriter) writen4(b1 byte, b2 byte, b3 byte, b4 byte) {
-// 	c := z.grow(4)
-// 	z.b[c] = b1
-// 	z.b[c+1] = b2
-// 	z.b[c+2] = b3
-// 	z.b[c+3] = b4
-// }
-
 func (z *bytesEncWriter) atEndOfEncode() {
 func (z *bytesEncWriter) atEndOfEncode() {
 	*(z.out) = z.b[:z.c]
 	*(z.out) = z.b[:z.c]
 }
 }