@@ -6,6 +6,7 @@ package ottlfuncs
66import (
77 "context"
88 "errors"
9+ "fmt"
910 "testing"
1011
1112 "github.com/stretchr/testify/assert"
@@ -323,3 +324,106 @@ func TestDelete_Errors(t *testing.T) {
323324 })
324325 }
325326}
327+
328+ func BenchmarkDelete_Position_SliceSizes (b * testing.B ) {
329+ testCases := []struct {
330+ name string
331+ sliceSize , index int
332+ }{
333+ {"Last-Small/10" , 10 , 9 },
334+ {"Last-Medium/100" , 100 , 99 },
335+ {"Last-Large/1000" , 1000 , 999 },
336+ {"Last-Huge/10000" , 10000 , 9999 },
337+ {"Middle-Small/10" , 10 , 4 },
338+ {"Middle-Medium/100" , 100 , 49 },
339+ {"Middle-Large/1000" , 1000 , 499 },
340+ {"Middle-Huge/10000" , 10000 , 4999 },
341+ {"First-Small/10" , 10 , 0 },
342+ {"First-Medium/100" , 100 , 0 },
343+ {"First-Large/1000" , 1000 , 0 },
344+ {"First-Huge/10000" , 10000 , 0 },
345+ }
346+ for _ , tc := range testCases {
347+ b .Run (tc .name , func (b * testing.B ) {
348+ benchmarkDeleteIndex (b , tc .sliceSize , tc .index )
349+ })
350+ }
351+ }
352+
353+ func BenchmarkDelete_DeleteRanges (b * testing.B ) {
354+ testCases := []struct {
355+ name string
356+ sliceSize , start , end int
357+ }{
358+ {"Range1" , 1000 , 500 , 501 },
359+ {"Range10" , 1000 , 500 , 510 },
360+ {"Range100" , 1000 , 500 , 600 },
361+ {"Range500" , 1000 , 500 , 999 },
362+ }
363+ for _ , tc := range testCases {
364+ b .Run (tc .name , func (b * testing.B ) {
365+ benchmarkDelete (b , tc .sliceSize , tc .start , tc .end )
366+ })
367+ }
368+ }
369+
370+ func benchmarkDeleteIndex (b * testing.B , sliceSize , index int ) {
371+ benchmarkDelete (b , sliceSize , index , 0 )
372+ }
373+
374+ func benchmarkDelete (b * testing.B , sliceSize , startIndex , endIndex int ) {
375+ startIndexGetter := mockIntGetter (int64 (startIndex ))
376+
377+ var endIndexGetter ottl.Optional [ottl.IntGetter [any ]]
378+ if endIndex > 0 {
379+ endIndexGetter = ottl .NewTestingOptional (mockIntGetter (int64 (endIndex )))
380+ } else {
381+ endIndexGetter = nilOptional
382+ }
383+
384+ originalSlice := createBenchmarkSlice (sliceSize )
385+
386+ b .ResetTimer ()
387+ b .ReportAllocs ()
388+
389+ for i := 0 ; i < b .N ; i ++ {
390+ // Create a copy of the slice for each iteration, since we're modifying target inside deleteFrom func.
391+ sourceSlice := pcommon .NewSlice ()
392+ originalSlice .CopyTo (sourceSlice )
393+
394+ target := sliceGetSetter (func (_ context.Context , _ any ) (any , error ) {
395+ return sourceSlice , nil
396+ })
397+ exprFunc := deleteFrom (target , startIndexGetter , endIndexGetter )
398+
399+ res := pcommon .NewSlice ()
400+ b .StartTimer ()
401+ _ , err := exprFunc (b .Context (), res )
402+ b .StopTimer ()
403+ if err != nil {
404+ b .Fatal (err )
405+ }
406+ }
407+ }
408+
409+ func createBenchmarkSlice (sliceSize int ) pcommon.Slice {
410+ slice := pcommon .NewSlice ()
411+
412+ for i := 0 ; i < sliceSize ; i ++ {
413+ switch i % 5 {
414+ case 0 :
415+ slice .AppendEmpty ().SetStr (fmt .Sprintf ("string_%d" , i ))
416+ case 1 :
417+ slice .AppendEmpty ().SetInt (int64 (i ))
418+ case 2 :
419+ slice .AppendEmpty ().SetDouble (float64 (i ))
420+ case 3 :
421+ slice .AppendEmpty ().SetBool (i % 2 == 0 )
422+ case 4 :
423+ nested := slice .AppendEmpty ().SetEmptySlice ()
424+ nested .AppendEmpty ().SetInt (int64 (i ))
425+ }
426+ }
427+
428+ return slice
429+ }
0 commit comments