From 24cdbcfe449ac192605ae9de5d54e5efcb648750 Mon Sep 17 00:00:00 2001 From: mzz2017 Date: Sun, 14 Aug 2022 23:36:01 +0800 Subject: [PATCH] optimize: remove regexp and use bytes.IndexByte to improve the performance --- pkg/common/scan.go | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/pkg/common/scan.go b/pkg/common/scan.go index 64f10eb..02e7223 100644 --- a/pkg/common/scan.go +++ b/pkg/common/scan.go @@ -1,23 +1,34 @@ package common import ( - "regexp" + "bytes" ) -var newlineReg = regexp.MustCompile(`\r?\n|\r\n?`) - // ScanLines scan lines but keep the suffix \r and \n func ScanLines(data []byte, atEOF bool) (advance int, token []byte, err error) { if atEOF && len(data) == 0 { return 0, nil, nil } - if loc := newlineReg.FindIndex(data); len(loc) > 0 { - delimiterLen := 1 - i := loc[0] - if i+1 < len(data) && data[i] == '\r' && data[i+1] == '\n' { - delimiterLen = 2 + if i, j := bytes.IndexByte(data, '\r'), bytes.IndexByte(data, '\n'); i >= 0 || j >= 0 { + // case 1: TOKEN\r\nTOKEN + if i >= 0 && j >= 0 { + if i+1 == j { + return i + 2, data[:i+2], nil + } + if i < j { + // case 2: TOKEN\rTOKEN\nTOKEN + return i + 1, data[:i+1], nil + } else { + // case 3: TOKEN\nTOKEN\rTOKEN + return j + 1, data[:j+1], nil + } + } else if i >= 0 { + // case 4: TOKEN\rTOKEN + return i + 1, data[:i+1], nil + } else { + // case 5: TOKEN\nTOKEN + return j + 1, data[:j+1], nil } - return i + delimiterLen, data[:i+delimiterLen], nil } // If we're at EOF, we have a final, non-terminated line. Return it. if atEOF {