Lex performance improvement (#176)
* Use []token instead of chan token name old time/op new time/op delta ParseToml-8 1.18ms ± 0% 0.91ms ± 0% -22.98% UnmarshalToml-8 1.29ms ± 0% 0.95ms ± 0% -25.96% name old alloc/op new alloc/op delta ParseToml-8 429kB ± 0% 444kB ± 0% +3.49% UnmarshalToml-8 451kB ± 0% 466kB ± 0% +3.32% name old allocs/op new allocs/op delta ParseToml-8 14.1k ± 0% 13.7k ± 0% -2.31% UnmarshalToml-8 15.1k ± 0% 14.7k ± 0% -2.16% * Lex on []byte instead of io.Reader name old time/op new time/op delta ParseToml-8 1.18ms ± 0% 0.29ms ± 0% -75.18% UnmarshalToml-8 1.27ms ± 0% 0.38ms ± 0% -70.38% name old alloc/op new alloc/op delta ParseToml-8 429kB ± 0% 135kB ± 0% -68.53% UnmarshalToml-8 451kB ± 0% 157kB ± 0% -65.22% name old allocs/op new allocs/op delta ParseToml-8 14.1k ± 0% 3.2k ± 0% -77.20% UnmarshalToml-8 15.1k ± 0% 4.2k ± 0% -72.00%
This commit is contained in:
@@ -13,9 +13,9 @@ import (
|
||||
)
|
||||
|
||||
type tomlParser struct {
|
||||
flow chan token
|
||||
flowIdx int
|
||||
flow []token
|
||||
tree *Tree
|
||||
tokensBuffer []token
|
||||
currentTable []string
|
||||
seenTableKeys []string
|
||||
}
|
||||
@@ -34,16 +34,10 @@ func (p *tomlParser) run() {
|
||||
}
|
||||
|
||||
func (p *tomlParser) peek() *token {
|
||||
if len(p.tokensBuffer) != 0 {
|
||||
return &(p.tokensBuffer[0])
|
||||
}
|
||||
|
||||
tok, ok := <-p.flow
|
||||
if !ok {
|
||||
if p.flowIdx >= len(p.flow) {
|
||||
return nil
|
||||
}
|
||||
p.tokensBuffer = append(p.tokensBuffer, tok)
|
||||
return &tok
|
||||
return &p.flow[p.flowIdx]
|
||||
}
|
||||
|
||||
func (p *tomlParser) assume(typ tokenType) {
|
||||
@@ -57,16 +51,12 @@ func (p *tomlParser) assume(typ tokenType) {
|
||||
}
|
||||
|
||||
func (p *tomlParser) getToken() *token {
|
||||
if len(p.tokensBuffer) != 0 {
|
||||
tok := p.tokensBuffer[0]
|
||||
p.tokensBuffer = p.tokensBuffer[1:]
|
||||
return &tok
|
||||
}
|
||||
tok, ok := <-p.flow
|
||||
if !ok {
|
||||
tok := p.peek()
|
||||
if tok == nil {
|
||||
return nil
|
||||
}
|
||||
return &tok
|
||||
p.flowIdx++
|
||||
return tok
|
||||
}
|
||||
|
||||
func (p *tomlParser) parseStart() tomlParserStateFn {
|
||||
@@ -374,13 +364,13 @@ func (p *tomlParser) parseArray() interface{} {
|
||||
return array
|
||||
}
|
||||
|
||||
func parseToml(flow chan token) *Tree {
|
||||
func parseToml(flow []token) *Tree {
|
||||
result := newTree()
|
||||
result.position = Position{1, 1}
|
||||
parser := &tomlParser{
|
||||
flowIdx: 0,
|
||||
flow: flow,
|
||||
tree: result,
|
||||
tokensBuffer: make([]token, 0),
|
||||
currentTable: make([]string, 0),
|
||||
seenTableKeys: make([]string, 0),
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user