Browse Source

optimize true/false/null:

Tao Wen 9 years ago
parent
commit
9c2b1d24b3
1 changed files with 53 additions and 23 deletions
  1. 53 23
      feature_stream.go

+ 53 - 23
feature_stream.go

@@ -4,16 +4,6 @@ import (
 	"io"
 )
 
-var bytesNull []byte
-var bytesTrue []byte
-var bytesFalse []byte
-
-func init() {
-	bytesNull = []byte("null")
-	bytesTrue = []byte("true")
-	bytesFalse = []byte("false")
-}
-
 type Stream struct {
 	out           io.Writer
 	buf           []byte
@@ -68,29 +58,69 @@ func (b *Stream) Write(p []byte) (nn int, err error) {
 
 
 // WriteByte writes a single byte.
-func (b *Stream) writeByte(c byte) error {
+func (b *Stream) writeByte(c byte) {
 	if b.Error != nil {
-		return b.Error
+		return
 	}
 	if b.Available() <= 0 && b.Flush() != nil {
-		return b.Error
+		return
 	}
 	b.buf[b.n] = c
 	b.n++
-	return nil
 }
 
-func (b *Stream) writeTwoBytes(c1 byte, c2 byte) error {
+func (b *Stream) writeTwoBytes(c1 byte, c2 byte) {
 	if b.Error != nil {
-		return b.Error
+		return
 	}
 	if b.Available() <= 1 && b.Flush() != nil {
-		return b.Error
+		return
 	}
 	b.buf[b.n] = c1
 	b.buf[b.n + 1] = c2
 	b.n += 2
-	return nil
+}
+
+func (b *Stream) writeThreeBytes(c1 byte, c2 byte, c3 byte) {
+	if b.Error != nil {
+		return
+	}
+	if b.Available() <= 2 && b.Flush() != nil {
+		return
+	}
+	b.buf[b.n] = c1
+	b.buf[b.n + 1] = c2
+	b.buf[b.n + 2] = c3
+	b.n += 3
+}
+
+func (b *Stream) writeFourBytes(c1 byte, c2 byte, c3 byte, c4 byte) {
+	if b.Error != nil {
+		return
+	}
+	if b.Available() <= 3 && b.Flush() != nil {
+		return
+	}
+	b.buf[b.n] = c1
+	b.buf[b.n + 1] = c2
+	b.buf[b.n + 2] = c3
+	b.buf[b.n + 3] = c4
+	b.n += 4
+}
+
+func (b *Stream) writeFiveBytes(c1 byte, c2 byte, c3 byte, c4 byte, c5 byte) {
+	if b.Error != nil {
+		return
+	}
+	if b.Available() <= 3 && b.Flush() != nil {
+		return
+	}
+	b.buf[b.n] = c1
+	b.buf[b.n + 1] = c2
+	b.buf[b.n + 2] = c3
+	b.buf[b.n + 3] = c4
+	b.buf[b.n + 4] = c5
+	b.n += 5
 }
 
 // Flush writes any buffered data to the underlying io.Writer.
@@ -195,22 +225,22 @@ func (stream *Stream) writeStringSlowPath(s string, i int, valLen int) {
 }
 
 func (stream *Stream) WriteNil() {
-	stream.Write(bytesNull)
+	stream.writeFourBytes('n', 'u', 'l', 'l')
 }
 
 func (stream *Stream) WriteTrue() {
-	stream.Write(bytesTrue)
+	stream.writeFourBytes('t', 'r', 'u', 'e')
 }
 
 func (stream *Stream) WriteFalse() {
-	stream.Write(bytesFalse)
+	stream.writeFiveBytes('f', 'a', 'l', 's', 'e')
 }
 
 func (stream *Stream) WriteBool(val bool) {
 	if val {
-		stream.Write(bytesTrue)
+		stream.WriteTrue()
 	} else {
-		stream.Write(bytesFalse)
+		stream.WriteFalse()
 	}
 }