mirror of
https://github.com/go-task/task.git
synced 2026-06-15 20:01:40 +00:00
A benchmark was added. The performance improvement is considerable: BenchmarkNoPool-4 30000 43405 ns/op BenchmarkPool-4 20000 71219 ns/op
70 lines
1.2 KiB
Go
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)
|
|
}
|
|
}
|
|
}
|