test with regexp

This commit is contained in:
s.kamardin 2016-01-19 20:52:32 +03:00
parent b3c56781e2
commit ec7fba7e40
2 changed files with 128 additions and 4 deletions

View File

@ -5,36 +5,47 @@ import (
"fmt"
"github.com/gobwas/glob/match"
"math/rand"
"regexp"
"strings"
"testing"
)
const (
pattern_all = "[a-z][!a-x]*cat*[h][!b]*eyes*"
regexp_all = `[a-z][^a-x].*cat.*[h][^b].*eyes.*`
fixture_all = "my cat has very bright eyes"
pattern_plain = "google.com"
regexp_plain = `google\.com`
fixture_plain = "google.com"
pattern_multiple = "https://*.google.*"
regexp_multiple = `https:\/\/.*\.google\..*`
fixture_multiple = "https://account.google.com"
pattern_alternatives = "{https://*.google.*,*yandex.*,*yahoo.*,*mail.ru}"
regexp_alternatives = `(https:\/\/.*\.google\..*|.*yandex\..*|.*yahoo\..*|.*mail\.ru)`
fixture_alternatives = "http://yahoo.com"
pattern_alternatives_suffix = "{https://*gobwas.com,http://exclude.gobwas.com}"
regexp_alternatives_suffix = `(https:\/\/.*gobwas\.com|http://exclude.gobwas.com)`
fixture_alternatives_suffix_first = "https://safe.gobwas.com"
fixture_alternatives_suffix_second = "http://exclude.gobwas.com"
pattern_prefix = "abc*"
regexp_prefix = `abc.*`
pattern_suffix = "*def"
regexp_suffix = `.*def`
pattern_prefix_suffix = "ab*ef"
regexp_prefix_suffix = `ab.*ef`
fixture_prefix_suffix = "abcdef"
pattern_alternatives_combine_lite = "{abc*def,abc?def,abc[zte]def}"
regexp_alternatives_combine_lite = `(abc.*def|abc.def|abc[zte]def)`
fixture_alternatives_combine_lite = "abczdef"
pattern_alternatives_combine_hard = "{abc*[a-c]def,abc?[d-g]def,abc[zte]?def}"
regexp_alternatives_combine_hard = `(abc.*[a-c]def|abc.[d-g]def|abc[zte].def)`
fixture_alternatives_combine_hard = "abczqdef"
)
@ -100,6 +111,9 @@ func DrawPatterns(t *testing.T) {
pattern string
sep string
}{
{
pattern: pattern_all,
},
{
pattern: pattern_alternatives_suffix,
sep: separators,
@ -110,6 +124,9 @@ func DrawPatterns(t *testing.T) {
{
pattern: pattern_alternatives_combine_hard,
},
{
pattern: "{https://*.mail.ru,*my.mail.ru,*my.myalpha*.i.mail.ru}",
},
} {
glob, err := Compile(test.pattern, test.sep)
if err != nil {
@ -249,16 +266,27 @@ func BenchmarkParse(b *testing.B) {
Compile(pattern_all)
}
}
func BenchmarkParseRegexp(b *testing.B) {
for i := 0; i < b.N; i++ {
regexp.MustCompile(regexp_all)
}
}
func BenchmarkAll(b *testing.B) {
m, _ := Compile(pattern_all)
// fmt.Println("tree all:")
// fmt.Println(m)
for i := 0; i < b.N; i++ {
_ = m.Match(fixture_all)
}
}
func BenchmarkAllRegexp(b *testing.B) {
m := regexp.MustCompile(regexp_all)
f := []byte(fixture_all)
for i := 0; i < b.N; i++ {
_ = m.Match(f)
}
}
func BenchmarkMultiple(b *testing.B) {
m, _ := Compile(pattern_multiple)
@ -267,6 +295,15 @@ func BenchmarkMultiple(b *testing.B) {
_ = m.Match(fixture_multiple)
}
}
func BenchmarkMultipleRegexp(b *testing.B) {
m := regexp.MustCompile(regexp_multiple)
f := []byte(fixture_multiple)
for i := 0; i < b.N; i++ {
_ = m.Match(f)
}
}
func BenchmarkAlternatives(b *testing.B) {
m, _ := Compile(pattern_alternatives)
@ -302,6 +339,47 @@ func BenchmarkAlternativesCombineHard(b *testing.B) {
_ = m.Match(fixture_alternatives_combine_hard)
}
}
func BenchmarkAlternativesRegexp(b *testing.B) {
m := regexp.MustCompile(regexp_alternatives)
f := []byte(fixture_alternatives)
for i := 0; i < b.N; i++ {
_ = m.Match(f)
}
}
func BenchmarkAlternativesSuffixFirstRegexp(b *testing.B) {
m := regexp.MustCompile(regexp_alternatives_suffix)
f := []byte(fixture_alternatives_suffix_first)
for i := 0; i < b.N; i++ {
_ = m.Match(f)
}
}
func BenchmarkAlternativesSuffixSecondRegexp(b *testing.B) {
m := regexp.MustCompile(regexp_alternatives_suffix)
f := []byte(fixture_alternatives_suffix_second)
for i := 0; i < b.N; i++ {
_ = m.Match(f)
}
}
func BenchmarkAlternativesCombineLiteRegexp(b *testing.B) {
m := regexp.MustCompile(regexp_alternatives_combine_lite)
f := []byte(fixture_alternatives_combine_lite)
for i := 0; i < b.N; i++ {
_ = m.Match(f)
}
}
func BenchmarkAlternativesCombineHardRegexp(b *testing.B) {
m := regexp.MustCompile(regexp_alternatives_combine_hard)
f := []byte(fixture_alternatives_combine_hard)
for i := 0; i < b.N; i++ {
_ = m.Match(f)
}
}
func BenchmarkPlain(b *testing.B) {
m, _ := Compile(pattern_plain)
@ -309,6 +387,15 @@ func BenchmarkPlain(b *testing.B) {
_ = m.Match(fixture_plain)
}
}
func BenchmarkPlainRegexp(b *testing.B) {
m := regexp.MustCompile(regexp_plain)
f := []byte(fixture_plain)
for i := 0; i < b.N; i++ {
_ = m.Match(f)
}
}
func BenchmarkPrefix(b *testing.B) {
m, _ := Compile(pattern_prefix)
@ -316,6 +403,15 @@ func BenchmarkPrefix(b *testing.B) {
_ = m.Match(fixture_prefix_suffix)
}
}
func BenchmarkPrefixRegexp(b *testing.B) {
m := regexp.MustCompile(regexp_prefix)
f := []byte(fixture_prefix_suffix)
for i := 0; i < b.N; i++ {
_ = m.Match(f)
}
}
func BenchmarkSuffix(b *testing.B) {
m, _ := Compile(pattern_suffix)
@ -323,6 +419,15 @@ func BenchmarkSuffix(b *testing.B) {
_ = m.Match(fixture_prefix_suffix)
}
}
func BenchmarkSuffixRegexp(b *testing.B) {
m := regexp.MustCompile(regexp_suffix)
f := []byte(fixture_prefix_suffix)
for i := 0; i < b.N; i++ {
_ = m.Match(f)
}
}
func BenchmarkPrefixSuffix(b *testing.B) {
m, _ := Compile(pattern_prefix_suffix)
@ -330,6 +435,14 @@ func BenchmarkPrefixSuffix(b *testing.B) {
_ = m.Match(fixture_prefix_suffix)
}
}
func BenchmarkPrefixSuffixRegexp(b *testing.B) {
m := regexp.MustCompile(regexp_prefix_suffix)
f := []byte(fixture_prefix_suffix)
for i := 0; i < b.N; i++ {
_ = m.Match(f)
}
}
//BenchmarkParse-8 500000 2235 ns/op
//BenchmarkAll-8 20000000 73.1 ns/op

View File

@ -100,8 +100,7 @@ Run `go test -bench=.` from source root to see the benchmarks:
Pattern | Fixture | Operations | Speed (ns/op)
--------|---------|------------|--------------
`[a-z][!a-x]*cat*[h][!b]*eyes*` | - (parsing) | 50000 | 26497
`[a-z][!a-x]*cat*[h][!b]*eyes*` | `my cat has very bright eyes` | 2000000 | 615
`[a-z][!a-x]*cat*[h][!b]*eyes*` | `my cat has very bright eyes` | 2000000 | 549
`https://*.google.*` | `https://account.google.com` | 10000000 | 121
`{https://*.google.*,*yandex.*,*yahoo.*,*mail.ru}` | `http://yahoo.com` | 10000000 | 167
`{https://*gobwas.com,http://exclude.gobwas.com}` | `https://safe.gobwas.com` | 50000000 | 24.7
@ -109,6 +108,18 @@ Pattern | Fixture | Operations | Speed (ns/op)
`*def` | `abcdef` | 200000000 | 9.60
`ab*ef` | `abcdef` | 100000000 | 15.2
The same things with `regexp` package:
Pattern | Fixture | Operations | Speed (ns/op)
--------|---------|------------|--------------
`[a-z][^a-x].*cat.*[h][^b].*eyes.*` | `my cat has very bright eyes` | 500000 | 2762
`https:\/\/.*\.google\..*` | `https://account.google.com` | 1000000 | 1191
`(https:\/\/.*\.google\..*|.*yandex\..*|.*yahoo\..*|.*mail\.ru)` | `http://yahoo.com` | 1000000 | 1444
`(https:\/\/.*gobwas\.com|http://exclude.gobwas.com)` | `https://safe.gobwas.com` | 1000000 | 1037
`abc.*` | `abcdef` | 3000000 | 414
`.*def` | `abcdef` | 5000000 | 276
`ab.*ef` | `abcdef` | 5000000 | 352
[godoc-image]: https://godoc.org/github.com/gobwas/glob?status.svg
[godoc-url]: https://godoc.org/github.com/gobwas/glob
[travis-image]: https://travis-ci.org/gobwas/glob.svg?branch=master