1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
package eval
import (
"testing"
"src.elv.sh/pkg/parse"
)
var benchmarks = []struct {
name string
code string
}{
{"empty", ""},
{"nop", "nop"},
{"nop-nop", "nop | nop"},
{"put-x", "put x"},
{"for-100", "for x [(range 100)] { }"},
{"range-100", "range 100 | each {|_| }"},
{"read-local", "var x = val; nop $x"},
{"read-upval", "var x = val; { nop $x }"},
}
func BenchmarkEval(b *testing.B) {
for _, bench := range benchmarks {
b.Run(bench.name, func(b *testing.B) {
ev := NewEvaler()
src := parse.Source{Name: "[benchmark]", Code: bench.code}
tree, err := parse.Parse(src, parse.Config{})
if err != nil {
panic(err)
}
op, _, err := compile(ev.builtin.static(), ev.global.static(), nil, tree, nil)
if err != nil {
panic(err)
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
fm, cleanup := ev.prepareFrame(src, EvalCfg{Global: ev.Global()})
_, exec := op.prepare(fm)
_ = exec()
cleanup()
}
})
}
}
|