From e5f5c5716b73939c200383f451b4da1417db1958 Mon Sep 17 00:00:00 2001 From: Tao Wen Date: Tue, 6 Dec 2016 20:01:22 +0800 Subject: [PATCH] make skipWhitespaces faster --- jsoniter.go | 66 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/jsoniter.go b/jsoniter.go index b1d5ce3..6774a10 100644 --- a/jsoniter.go +++ b/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