github.com/maresnic/mr-kong@v1.0.0/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  }