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  }