github.com/alecthomas/kong@v0.9.1-0.20240410131203-2ab5733f1179/benchmark_test.go (about) 1 package kong 2 3 import ( 4 "fmt" 5 "strconv" 6 "testing" 7 8 "github.com/alecthomas/assert/v2" 9 ) 10 11 func BenchmarkKong_interpolate(b *testing.B) { 12 prepareKong := func(t testing.TB, count int) *Kong { 13 t.Helper() 14 k := &Kong{ 15 vars: make(Vars, count), 16 registry: NewRegistry().RegisterDefaults(), 17 } 18 for i := 0; i < count; i++ { 19 helpVar := fmt.Sprintf("help_param%d", i) 20 k.vars[helpVar] = strconv.Itoa(i) 21 } 22 grammar := &struct { 23 Param0 string `help:"${help_param0}"` 24 }{} 25 model, err := build(k, grammar) 26 assert.NoError(t, err) 27 for i := 0; i < count; i++ { 28 model.Node.Flags = append(model.Node.Flags, &Flag{ 29 Value: &Value{ 30 Help: fmt.Sprintf("${help_param%d}", i), 31 Tag: newEmptyTag(), 32 }, 33 }) 34 } 35 k.Model = model 36 return k 37 } 38 39 for _, count := range []int{5, 500, 5000} { 40 count := count 41 b.Run(strconv.Itoa(count), func(b *testing.B) { 42 var err error 43 k := prepareKong(b, count) 44 for i := 0; i < b.N; i++ { 45 err = k.interpolate(k.Model.Node) 46 } 47 assert.NoError(b, err) 48 b.ReportAllocs() 49 }) 50 } 51 } 52 53 func Benchmark_interpolateValue(b *testing.B) { 54 varsLen := 10000 55 k := &Kong{ 56 vars: make(Vars, 10000), 57 registry: NewRegistry().RegisterDefaults(), 58 } 59 for i := 0; i < varsLen; i++ { 60 helpVar := fmt.Sprintf("help_param%d", i) 61 k.vars[helpVar] = strconv.Itoa(i) 62 } 63 grammar := struct { 64 Param9999 string `kong:"cmd,help=${help_param9999}"` 65 }{} 66 model, err := build(k, &grammar) 67 if err != nil { 68 b.FailNow() 69 } 70 k.Model = model 71 flag := k.Model.Flags[0] 72 for i := 0; i < b.N; i++ { 73 err = k.interpolateValue(flag.Value, k.vars) 74 if err != nil { 75 b.FailNow() 76 } 77 } 78 b.ReportAllocs() 79 }