From f4b46fad27b4d4f7f3f5649b5f2948c298c3a5ae Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Mon, 31 Jul 2017 03:21:35 +0900 Subject: [PATCH] Inline function calls in a tight loop Manually inline function calls in a tight loop as Go compiler does not inline non-leaf functions. It is observed that this unpleasant code change resulted up to 10% performance improvement. --- src/pattern.go | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/pattern.go b/src/pattern.go index 64296d7..8cb2098 100644 --- a/src/pattern.go +++ b/src/pattern.go @@ -301,7 +301,12 @@ func (p *Pattern) MatchItem(item *Item, withPos bool, slab *util.Slab) (*Result, } func (p *Pattern) basicMatch(item *Item, withPos bool, slab *util.Slab) (Offset, int, *[]int) { - input := p.prepareInput(item) + var input []Token + if len(p.nth) == 0 { + input = []Token{Token{text: &item.text, prefixLength: 0}} + } else { + input = p.transformInput(item) + } if p.fuzzy { return p.iter(p.fuzzyAlgo, input, p.caseSensitive, p.normalize, p.forward, p.text, withPos, slab) } @@ -309,7 +314,12 @@ func (p *Pattern) basicMatch(item *Item, withPos bool, slab *util.Slab) (Offset, } func (p *Pattern) extendedMatch(item *Item, withPos bool, slab *util.Slab) ([]Offset, int, *[]int) { - input := p.prepareInput(item) + var input []Token + if len(p.nth) == 0 { + input = []Token{Token{text: &item.text, prefixLength: 0}} + } else { + input = p.transformInput(item) + } offsets := []Offset{} var totalScore int var allPos *[]int @@ -353,11 +363,7 @@ func (p *Pattern) extendedMatch(item *Item, withPos bool, slab *util.Slab) ([]Of return offsets, totalScore, allPos } -func (p *Pattern) prepareInput(item *Item) []Token { - if len(p.nth) == 0 { - return []Token{Token{text: &item.text, prefixLength: 0}} - } - +func (p *Pattern) transformInput(item *Item) []Token { if item.transformed != nil { return *item.transformed }