This commit is contained in:
gobwas 2016-02-02 14:57:42 +03:00
parent 51a65fcc7d
commit 88fcc08f39
5 changed files with 38 additions and 11 deletions

View File

@ -11,7 +11,7 @@ func optimize(matcher match.Matcher) match.Matcher {
switch m := matcher.(type) { switch m := matcher.(type) {
case match.Any: case match.Any:
if m.Separators == "" { if len(m.Separators) == 0 {
return match.Super{} return match.Super{}
} }
@ -135,15 +135,15 @@ func glueAsEvery(matchers []match.Matcher) match.Matcher {
hasSuper bool hasSuper bool
hasSingle bool hasSingle bool
min int min int
separator string separator []rune
) )
for i, matcher := range matchers { for i, matcher := range matchers {
var sep string var sep []rune
switch m := matcher.(type) {
switch m := matcher.(type) {
case match.Super: case match.Super:
sep = "" sep = []rune{}
hasSuper = true hasSuper = true
case match.Any: case match.Any:
@ -486,7 +486,7 @@ func doAnyOf(n *nodeAnyOf, s string) (match.Matcher, error) {
return match.AnyOf{matchers}, nil return match.AnyOf{matchers}, nil
} }
func do(leaf node, s string) (m match.Matcher, err error) { func do(leaf node, s []rune) (m match.Matcher, err error) {
switch n := leaf.(type) { switch n := leaf.(type) {
case *nodeAnyOf: case *nodeAnyOf:
@ -659,7 +659,7 @@ func do2(node node, s string) ([]match.Matcher, error) {
return result, nil return result, nil
} }
func compile(ast *nodePattern, s string) (Glob, error) { func compile(ast *nodePattern, s []rune) (Glob, error) {
// ms, err := do2(ast, s) // ms, err := do2(ast, s)
// if err != nil { // if err != nil {
// return nil, err // return nil, err

View File

@ -33,13 +33,13 @@ type Glob interface {
// pattern { `,` pattern } // pattern { `,` pattern }
// comma-separated (without spaces) patterns // comma-separated (without spaces) patterns
// //
func Compile(pattern string, separators ...string) (Glob, error) { func Compile(pattern string, separators ...rune) (Glob, error) {
ast, err := parse(newLexer(pattern)) ast, err := parse(newLexer(pattern))
if err != nil { if err != nil {
return nil, err return nil, err
} }
matcher, err := compile(ast, strings.Join(separators, "")) matcher, err := compile(ast, separators)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -7,7 +7,7 @@ import (
) )
type Any struct { type Any struct {
Separators string Separators []rune
} }
func (self Any) Match(s string) bool { func (self Any) Match(s string) bool {

View File

@ -8,7 +8,7 @@ import (
// single represents ? // single represents ?
type Single struct { type Single struct {
Separators string Separators []rune
} }
func (self Single) Match(s string) bool { func (self Single) Match(s string) bool {

27
todo.txt Normal file
View File

@ -0,0 +1,27 @@
benchmark | old ns/op | new ns/op | delta
-----------------------------------------------|-----------|-------------|-----------
BenchmarkAllGlobMatch-4 512 711 +38.87%
BenchmarkMultipleGlobMatch-4 121 417 +244.63%
BenchmarkAlternativesGlobMatch-4 166 300 +80.72%
BenchmarkAlternativesSuffixFirstGlobMatch-4 23.5 292 +1142.55%
BenchmarkAlternativesSuffixSecondGlobMatch-4 29.8 355 +1091.28%
BenchmarkAlternativesCombineLiteGlobMatch-4 161 250 +55.28%
BenchmarkAlternativesCombineHardGlobMatch-4 325 334 +2.77%
BenchmarkPlainGlobMatch-4 7.20 154 +2038.89%
BenchmarkPrefixGlobMatch-4 8.75 113 +1191.43%
BenchmarkSuffixGlobMatch-4 9.07 115 +1167.92%
BenchmarkPrefixSuffixGlobMatch-4 15.1 125 +727.81%
BenchmarkIndexAny-4 887 255 -71.25%
BenchmarkIndexContains-4 492 247 -49.80%
BenchmarkIndexList-4 151 51.1 -66.16%
BenchmarkIndexMax-4 442 92.4 -79.10%
BenchmarkIndexMin-4 516 161 -68.80%
BenchmarkIndexNothing-4 452 92.8 -79.47%
BenchmarkIndexPrefixSuffix-4 84.3 57.2 -32.15%
BenchmarkIndexPrefix-4 85.1 55.9 -34.31%
BenchmarkIndexRange-4 170 60.6 -64.35%
BenchmarkRowIndex-4 172 94.0 -45.35%
BenchmarkIndexSingle-4 61.0 35.8 -41.31%
BenchmarkIndexSuffix-4 84.8 55.7 -34.32%
BenchmarkIndexSuper-4 461 192 -58.35%
BenchmarkIndexText-4 84.6 54.4 -35.70%