Files
go-task/execext/exec_test.go
Andrey Nering 451b965fb0 execext: use sync.Pool to instantiate parser and runner
A benchmark was added. The performance improvement is considerable:

BenchmarkNoPool-4   	   30000	     43405 ns/op
BenchmarkPool-4     	   20000	     71219 ns/op
2017-09-02 11:32:24 -03:00

70 lines
1.2 KiB
Go

// execext_test.go
package execext
import (
"context"
"io/ioutil"
"strings"
"sync"
"testing"
"mvdan.cc/sh/interp"
"mvdan.cc/sh/syntax"
)
func BenchmarkNoPool(b *testing.B) {
for i := 0; i < b.N; i++ {
f, err := syntax.NewParser().Parse(strings.NewReader(`echo "Hello, World!"`), "")
if err != nil {
panic(err)
}
r := interp.Runner{
Context: context.TODO(),
Stdout: ioutil.Discard,
Stderr: ioutil.Discard,
}
if err = r.Reset(); err != nil {
panic(err)
}
if err = r.Run(f); err != nil {
panic(err)
}
}
}
func BenchmarkPool(b *testing.B) {
parserPool := sync.Pool{
New: func() interface{} {
return syntax.NewParser()
},
}
runnerPool := sync.Pool{
New: func() interface{} {
return &interp.Runner{}
},
}
for i := 0; i < b.N; i++ {
parser := parserPool.Get().(*syntax.Parser)
defer parserPool.Put(parser)
f, err := parser.Parse(strings.NewReader(`echo "Hello, World!"`), "")
if err != nil {
panic(err)
}
r := runnerPool.Get().(*interp.Runner)
defer runnerPool.Put(r)
r.Stdout = ioutil.Discard
r.Stderr = ioutil.Discard
if err = r.Reset(); err != nil {
panic(err)
}
if err = r.Run(f); err != nil {
panic(err)
}
}
}