benchmarks

This commit is contained in:
gobwas 2016-02-05 15:15:36 +03:00
parent 6b71a60e74
commit ed108ad05a
5 changed files with 135 additions and 13 deletions

View File

@ -1,8 +1,6 @@
package glob package glob
import ( import (
"fmt"
"github.com/gobwas/glob/match"
"regexp" "regexp"
"testing" "testing"
) )
@ -152,13 +150,6 @@ func TestGlob(t *testing.T) {
} }
} }
func TestAllGlobMatch(t *testing.T) {
m, _ := Compile(pattern_all)
fmt.Println("HI", m.(match.Matcher).String())
m.Match(fixture_all_match)
}
func BenchmarkParseGlob(b *testing.B) { func BenchmarkParseGlob(b *testing.B) {
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
Compile(pattern_all) Compile(pattern_all)
@ -186,6 +177,7 @@ func BenchmarkAllGlobMatchParallel(b *testing.B) {
} }
}) })
} }
func BenchmarkAllRegexpMatch(b *testing.B) { func BenchmarkAllRegexpMatch(b *testing.B) {
m := regexp.MustCompile(regexp_all) m := regexp.MustCompile(regexp_all)
f := []byte(fixture_all_match) f := []byte(fixture_all_match)

View File

@ -77,7 +77,6 @@ func (self BTree) Match(s string) bool {
limit = inputLen limit = inputLen
} }
fmt.Println("ACQUIRE")
in := acquireSegments(inputLen) in := acquireSegments(inputLen)
for offset < limit { for offset < limit {

View File

@ -54,7 +54,6 @@ func init() {
func(i int) { func(i int) {
segmentsPools[i-1] = sync.Pool{ segmentsPools[i-1] = sync.Pool{
New: func() interface{} { New: func() interface{} {
fmt.Println("NEW", i)
return make([]int, 0, i) return make([]int, 0, i)
}, },
} }
@ -75,12 +74,10 @@ func getIdx(c int) int {
} }
func acquireSegments(c int) []int { func acquireSegments(c int) []int {
fmt.Println("GET", getIdx(c))
return segmentsPools[getIdx(c)].Get().([]int)[:0] return segmentsPools[getIdx(c)].Get().([]int)[:0]
} }
func releaseSegments(s []int) { func releaseSegments(s []int) {
fmt.Println("PUT", getIdx(cap(s)))
segmentsPools[getIdx(cap(s))].Put(s) segmentsPools[getIdx(cap(s))].Put(s)
} }

37
match/segements_test.go Normal file
View File

@ -0,0 +1,37 @@
package match
import (
"testing"
)
func BenchmarkPerfPoolSequenced(b *testing.B) {
pool := NewPoolSequenced(32, 32)
for i := 0; i < b.N; i++ {
s := pool.Get()
pool.Put(s)
}
}
func BenchmarkPerfPoolSynced(b *testing.B) {
pool := NewPoolSynced(32)
for i := 0; i < b.N; i++ {
s := pool.Get()
pool.Put(s)
}
}
func BenchmarkPerfPoolPoolNative(b *testing.B) {
pool := NewPoolNative(32)
for i := 0; i < b.N; i++ {
s := pool.Get()
pool.Put(s)
}
}
func BenchmarkPerfMake(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = make([]int, 0, 32)
}
}

97
match/segments.go Normal file
View File

@ -0,0 +1,97 @@
package match
import "sync"
// Pool holds Clients.
type PoolSequenced struct {
size int
pool chan []int
}
// NewPool creates a new pool of Clients.
func NewPoolSequenced(max, size int) *PoolSequenced {
return &PoolSequenced{
size: size,
pool: make(chan []int, max),
}
}
// Borrow a Client from the pool.
func (p *PoolSequenced) Get() []int {
var s []int
select {
case s = <-p.pool:
default:
s = make([]int, 0, p.size)
}
return s[:0]
}
// Return returns a Client to the pool.
func (p *PoolSequenced) Put(s []int) {
select {
case p.pool <- s:
default:
// let it go, let it go...
}
}
type PoolSynced struct {
size int
mu sync.Mutex
list [][]int
}
func NewPoolSynced(size int) *PoolSynced {
return &PoolSynced{
size: size,
}
}
func (p *PoolSynced) Get() []int {
var s []int
p.mu.Lock()
ll := len(p.list)
if ll > 0 {
s, p.list = p.list[ll-1], p.list[:ll-1]
}
p.mu.Unlock()
if s == nil {
return make([]int, 0, p.size)
}
return s[:0]
}
func (p *PoolSynced) Put(s []int) {
p.mu.Lock()
defer p.mu.Unlock()
p.list = append(p.list, s)
}
type PoolNative struct {
size int
pool sync.Pool
}
func NewPoolNative(size int) *PoolNative {
return &PoolNative{
size: size,
}
}
func (p *PoolNative) Get() []int {
s := p.pool.Get()
if s == nil {
return make([]int, 0, p.size)
}
return s.([]int)
}
func (p *PoolNative) Put(s []int) {
p.pool.Put(s)
}