Ver código fonte

make skipWhitespaces faster

Tao Wen 9 anos atrás
pai
commit
e5f5c5716b
1 arquivos alterados com 39 adições e 27 exclusões
  1. 39 27
      jsoniter.go

+ 39 - 27
jsoniter.go

@@ -72,16 +72,20 @@ func ParseString(input string) *Iterator {
 }
 
 func (iter *Iterator) skipWhitespaces() {
-	c := iter.readByte()
 	for {
-		switch c {
-		case ' ', '\n', '\t', 'r':
-			c = iter.readByte()
-			continue
+		for i := iter.head; i < iter.tail; i++ {
+			c := iter.buf[i]
+			switch c {
+			case ' ', '\n', '\t', 'r':
+				continue
+			}
+			iter.head = i
+			return
+		}
+		if !iter.loadMore() {
+			return
 		}
-		break
 	}
-	iter.unreadByte()
 }
 
 func (iter *Iterator) ReportError(operation string, msg string) {
@@ -107,25 +111,10 @@ func (iter *Iterator) CurrentBuffer() string {
 
 func (iter *Iterator) readByte() (ret byte) {
 	if iter.head == iter.tail {
-		if iter.reader == nil {
-			iter.Error = io.EOF
-			return
-		}
-		for {
-			n, err := iter.reader.Read(iter.buf)
-			if n == 0 {
-				if err != nil {
-					iter.Error = err
-					return
-				} else {
-					// n == 0, err == nil is not EOF
-					continue
-				}
-			} else {
-				iter.head = 0
-				iter.tail = n
-				break
-			}
+		if iter.loadMore() {
+			ret = iter.buf[iter.head]
+			iter.head++
+			return ret
 		}
 	}
 	ret = iter.buf[iter.head]
@@ -133,6 +122,29 @@ func (iter *Iterator) readByte() (ret byte) {
 	return ret
 }
 
+func (iter *Iterator) loadMore() bool {
+	if iter.reader == nil {
+		iter.Error = io.EOF
+		return false
+	}
+	for {
+		n, err := iter.reader.Read(iter.buf)
+		if n == 0 {
+			if err != nil {
+				iter.Error = err
+				return false
+			} else {
+				// n == 0, err == nil is not EOF
+				continue
+			}
+		} else {
+			iter.head = 0
+			iter.tail = n
+			return true
+		}
+	}
+}
+
 func (iter *Iterator) unreadByte() {
 	if iter.head == 0 {
 		iter.ReportError("unreadByte", "unread too many bytes")
@@ -314,7 +326,7 @@ func (iter *Iterator) ReadStringAsBytes() (ret []byte) {
 		iter.ReportError("ReadString", `expects " or n`)
 		return
 	}
-	end, escaped := stringEnd(iter.buf[iter.head:])
+	end, escaped := stringEnd(iter.buf[iter.head:iter.tail])
 	if end != -1 && !escaped {
 		ret = iter.buf[iter.head:iter.head+end-1]
 		iter.head += end