Use bytes.Buffer for tomlLexer.buffer (#166)
* Use bytes.Buffer for tomlLexer.buffer * Add BenchmarkLexer Fix #165 name old time/op new time/op delta Lexer-4 343µs ± 1% 331µs ± 1% -3.56% (p=0.000 n=20+19) name old alloc/op new alloc/op delta Lexer-4 55.8kB ± 0% 50.8kB ± 0% -8.86% (p=0.000 n=20+20) name old allocs/op new allocs/op delta Lexer-4 2.01k ± 0% 1.84k ± 0% -8.46% (p=0.000 n=20+20)
This commit is contained in:
committed by
Thomas Pelletier
parent
048765b449
commit
26ae43fdee
@@ -6,6 +6,7 @@
|
|||||||
package toml
|
package toml
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@@ -24,7 +25,7 @@ type tomlLexStateFn func() tomlLexStateFn
|
|||||||
// Define lexer
|
// Define lexer
|
||||||
type tomlLexer struct {
|
type tomlLexer struct {
|
||||||
input *buffruneio.Reader // Textual source
|
input *buffruneio.Reader // Textual source
|
||||||
buffer []rune // Runes composing the current token
|
buffer bytes.Buffer // Runes composing the current token
|
||||||
tokens chan token
|
tokens chan token
|
||||||
depth int
|
depth int
|
||||||
line int
|
line int
|
||||||
@@ -53,13 +54,13 @@ func (l *tomlLexer) next() rune {
|
|||||||
r := l.read()
|
r := l.read()
|
||||||
|
|
||||||
if r != eof {
|
if r != eof {
|
||||||
l.buffer = append(l.buffer, r)
|
l.buffer.WriteRune(r)
|
||||||
}
|
}
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *tomlLexer) ignore() {
|
func (l *tomlLexer) ignore() {
|
||||||
l.buffer = make([]rune, 0)
|
l.buffer.Reset()
|
||||||
l.line = l.endbufferLine
|
l.line = l.endbufferLine
|
||||||
l.col = l.endbufferCol
|
l.col = l.endbufferCol
|
||||||
}
|
}
|
||||||
@@ -85,7 +86,7 @@ func (l *tomlLexer) emitWithValue(t tokenType, value string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (l *tomlLexer) emit(t tokenType) {
|
func (l *tomlLexer) emit(t tokenType) {
|
||||||
l.emitWithValue(t, string(l.buffer))
|
l.emitWithValue(t, l.buffer.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *tomlLexer) peek() rune {
|
func (l *tomlLexer) peek() rune {
|
||||||
@@ -536,7 +537,7 @@ func (l *tomlLexer) lexInsideTableArrayKey() tomlLexStateFn {
|
|||||||
for r := l.peek(); r != eof; r = l.peek() {
|
for r := l.peek(); r != eof; r = l.peek() {
|
||||||
switch r {
|
switch r {
|
||||||
case ']':
|
case ']':
|
||||||
if len(l.buffer) > 0 {
|
if l.buffer.Len() > 0 {
|
||||||
l.emit(tokenKeyGroupArray)
|
l.emit(tokenKeyGroupArray)
|
||||||
}
|
}
|
||||||
l.next()
|
l.next()
|
||||||
@@ -559,7 +560,7 @@ func (l *tomlLexer) lexInsideTableKey() tomlLexStateFn {
|
|||||||
for r := l.peek(); r != eof; r = l.peek() {
|
for r := l.peek(); r != eof; r = l.peek() {
|
||||||
switch r {
|
switch r {
|
||||||
case ']':
|
case ']':
|
||||||
if len(l.buffer) > 0 {
|
if l.buffer.Len() > 0 {
|
||||||
l.emit(tokenKeyGroup)
|
l.emit(tokenKeyGroup)
|
||||||
}
|
}
|
||||||
l.next()
|
l.next()
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package toml
|
package toml
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
@@ -748,3 +749,31 @@ func TestLexUnknownRvalue(t *testing.T) {
|
|||||||
{Position{1, 5}, tokenError, `no value can start with \`},
|
{Position{1, 5}, tokenError, `no value can start with \`},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkLexer(b *testing.B) {
|
||||||
|
sample := `title = "Hugo: A Fast and Flexible Website Generator"
|
||||||
|
baseurl = "http://gohugo.io/"
|
||||||
|
MetaDataFormat = "yaml"
|
||||||
|
pluralizeListTitles = false
|
||||||
|
|
||||||
|
[params]
|
||||||
|
description = "Documentation of Hugo, a fast and flexible static site generator built with love by spf13, bep and friends in Go"
|
||||||
|
author = "Steve Francia (spf13) and friends"
|
||||||
|
release = "0.22-DEV"
|
||||||
|
|
||||||
|
[[menu.main]]
|
||||||
|
name = "Download Hugo"
|
||||||
|
pre = "<i class='fa fa-download'></i>"
|
||||||
|
url = "https://github.com/spf13/hugo/releases"
|
||||||
|
weight = -200
|
||||||
|
`
|
||||||
|
rd := strings.NewReader(sample)
|
||||||
|
|
||||||
|
b.ResetTimer()
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
rd.Seek(0, os.SEEK_SET)
|
||||||
|
ch := lexToml(rd)
|
||||||
|
for _ = range ch {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user