Skip to content

Commit 49b0847

Browse files
committed
optimize memory allocations
1 parent 8c2b842 commit 49b0847

File tree

2 files changed

+47
-25
lines changed

2 files changed

+47
-25
lines changed

pattern.go

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"fmt"
77
"regexp"
88
"strings"
9+
"sync"
910
)
1011

1112
const (
@@ -14,6 +15,14 @@ const (
1415
patternMaxDiff = 1
1516
)
1617

18+
var (
19+
buffers = sync.Pool{
20+
New: func() interface{} {
21+
return new(bytes.Buffer)
22+
},
23+
}
24+
)
25+
1726
var (
1827
squote = '\''
1928
dquote = '"'
@@ -38,8 +47,17 @@ type Pattern struct {
3847

3948
func (p *Pattern) String() string {
4049
if p.str == nil {
41-
s := strings.Join(p.words, " ")
50+
buf := buffers.Get().(*bytes.Buffer)
51+
buf.Reset()
52+
for _, w := range p.words {
53+
if buf.Len() > 0 {
54+
buf.WriteByte(' ')
55+
}
56+
buf.WriteString(w)
57+
}
58+
s := buf.String()
4259
p.str = &s
60+
buffers.Put(buf)
4361
}
4462
return *p.str
4563
}
@@ -70,15 +88,17 @@ func (p *Pattern) WeakEqual(other *Pattern) bool {
7088

7189
func NewPattern(input string) *Pattern {
7290
pattern := &Pattern{}
73-
for _, p := range strings.Fields(removeQuotedAndBrackets(input)) {
91+
buf := buffers.Get().(*bytes.Buffer)
92+
buf.Reset()
93+
for _, p := range strings.Fields(removeQuotedAndBrackets(input, buf)) {
7494
p = strings.TrimRight(p, "=:],;")
7595
if len(p) < patterMinWordLen {
7696
continue
7797
}
7898
if hexWithPrefix.MatchString(p) || hex.MatchString(p) || uuid.MatchString(p) {
7999
continue
80100
}
81-
p = removeDigits(p)
101+
p = removeDigits(p, buf)
82102
if !isWord(p) {
83103
continue
84104
}
@@ -87,6 +107,7 @@ func NewPattern(input string) *Pattern {
87107
break
88108
}
89109
}
110+
buffers.Put(buf)
90111
return pattern
91112
}
92113

@@ -124,21 +145,19 @@ func isWord(s string) bool {
124145
return firstLast == 2
125146
}
126147

127-
func removeDigits(s string) string {
128-
res := bytes.NewBufferString(s)
129-
res.Reset()
148+
func removeDigits(s string, buf *bytes.Buffer) string {
149+
buf.Reset()
130150
for _, r := range s {
131151
if r >= '0' && r <= '9' {
132152
continue
133153
}
134-
res.WriteRune(r)
154+
buf.WriteRune(r)
135155
}
136-
return res.String()
156+
return buf.String()
137157
}
138158

139-
func removeQuotedAndBrackets(s string) string {
140-
res := bytes.NewBufferString(s)
141-
res.Reset()
159+
func removeQuotedAndBrackets(s string, buf *bytes.Buffer) string {
160+
buf.Reset()
142161
var quote, prev rune
143162
var seenBrackets []rune
144163
var l int
@@ -180,7 +199,7 @@ func removeQuotedAndBrackets(s string) string {
180199
if quote != 0 || len(seenBrackets) > 0 {
181200
continue
182201
}
183-
res.WriteRune(r)
202+
buf.WriteRune(r)
184203
}
185-
return res.String()
204+
return buf.String()
186205
}

pattern_test.go

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package logparser
22

33
import (
4-
"github.com/stretchr/testify/assert"
4+
"bytes"
55
"testing"
6+
7+
"github.com/stretchr/testify/assert"
68
)
79

810
func TestPattern(t *testing.T) {
@@ -96,18 +98,19 @@ func BenchmarkPatternWeakEqual(b *testing.B) {
9698
}
9799

98100
func TestPatternRemoveQuotedAndBrackets(t *testing.T) {
99-
assert.Equal(t, "foo bar", removeQuotedAndBrackets(`foo 'squoted' bar`))
100-
assert.Equal(t, "foo bar", removeQuotedAndBrackets(`foo 'squoted \'baz\'' bar`))
101-
assert.Equal(t, "foo bar", removeQuotedAndBrackets(`foo "dquoted" bar`))
102-
assert.Equal(t, "foo bar", removeQuotedAndBrackets(`foo "dquoted \"baz\"" bar`))
103-
assert.Equal(t, "foo bar", removeQuotedAndBrackets(`foo "dquoted 'squoted' " bar`))
104-
assert.Equal(t, "foo bar", removeQuotedAndBrackets(`foo 'squoted "baz"' bar`))
105-
106-
assert.Equal(t, " msg", removeQuotedAndBrackets(`[nio-8080-exec-9] msg`))
107-
assert.Equal(t, "json: ", removeQuotedAndBrackets(`json: {'arr': ['1', '2'], 'str': 'strval', 'age': 20}`))
101+
buf := bytes.NewBuffer(nil)
102+
assert.Equal(t, "foo bar", removeQuotedAndBrackets(`foo 'squoted' bar`, buf))
103+
assert.Equal(t, "foo bar", removeQuotedAndBrackets(`foo 'squoted \'baz\'' bar`, buf))
104+
assert.Equal(t, "foo bar", removeQuotedAndBrackets(`foo "dquoted" bar`, buf))
105+
assert.Equal(t, "foo bar", removeQuotedAndBrackets(`foo "dquoted \"baz\"" bar`, buf))
106+
assert.Equal(t, "foo bar", removeQuotedAndBrackets(`foo "dquoted 'squoted' " bar`, buf))
107+
assert.Equal(t, "foo bar", removeQuotedAndBrackets(`foo 'squoted "baz"' bar`, buf))
108+
109+
assert.Equal(t, " msg", removeQuotedAndBrackets(`[nio-8080-exec-9] msg`, buf))
110+
assert.Equal(t, "json: ", removeQuotedAndBrackets(`json: {'arr': ['1', '2'], 'str': 'strval', 'age': 20}`, buf))
108111
assert.Equal(t, " ",
109-
removeQuotedAndBrackets(`[Full GC (Allocation Failure) [CMS: 176934K->176934K(176960K), 0.0451364 secs] 253546K->253546K(253632K), [Metaspace: 11797K->11797K(1060864K)], 0.0454767 secs] [Times: user=0.04 sys=0.00, real=0.05 secs]`))
112+
removeQuotedAndBrackets(`[Full GC (Allocation Failure) [CMS: 176934K->176934K(176960K), 0.0451364 secs] 253546K->253546K(253632K), [Metaspace: 11797K->11797K(1060864K)], 0.0454767 secs] [Times: user=0.04 sys=0.00, real=0.05 secs]`, buf))
110113
assert.Equal(t,
111114
"Jun 16 21:41:24 host01 kubelet: W0616 21:41:24.642736 961 reflector.go:341]",
112-
removeQuotedAndBrackets(`Jun 16 21:41:24 host01 kubelet[961]: W0616 21:41:24.642736 961 reflector.go:341]`))
115+
removeQuotedAndBrackets(`Jun 16 21:41:24 host01 kubelet[961]: W0616 21:41:24.642736 961 reflector.go:341]`, buf))
113116
}

0 commit comments

Comments
 (0)