From 08e7d2f50151a00b22800e3f7020d0de8dee7dcf Mon Sep 17 00:00:00 2001 From: andrius4669 Date: Thu, 17 May 2018 15:32:25 +0300 Subject: [PATCH] bufio: avoid rescanning buffer multiple times in ReadSlice When existing data in buffer does not have delimiter, and new data is added with b.fill(), continue search from previous point instead of starting from beginning. --- src/bufio/bufio.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/bufio/bufio.go b/src/bufio/bufio.go index 72545a7509541b..a188160bb539ea 100644 --- a/src/bufio/bufio.go +++ b/src/bufio/bufio.go @@ -314,9 +314,11 @@ func (b *Reader) Buffered() int { return b.w - b.r } // ReadBytes or ReadString instead. // ReadSlice returns err != nil if and only if line does not end in delim. func (b *Reader) ReadSlice(delim byte) (line []byte, err error) { + s := 0 // search start index for { // Search buffer. - if i := bytes.IndexByte(b.buf[b.r:b.w], delim); i >= 0 { + if i := bytes.IndexByte(b.buf[b.r+s:b.w], delim); i >= 0 { + i += s line = b.buf[b.r : b.r+i+1] b.r += i + 1 break @@ -338,6 +340,8 @@ func (b *Reader) ReadSlice(delim byte) (line []byte, err error) { break } + s = b.w - b.r // do not rescan area we scanned before + b.fill() // buffer is not full }