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