@@ -453,3 +453,48 @@ func Benchmark_largeNestedArrayAccess(b *testing.B) {
453
453
require .NoError (b , err )
454
454
require .True (b , out .(bool ))
455
455
}
456
+
457
+ func Benchmark_sort (b * testing.B ) {
458
+ env := map [string ]interface {}{
459
+ "arr" : []any {55 , 58 , 42 , 61 , 75 , 52 , 64 , 62 , 16 , 79 , 40 , 14 , 50 , 76 , 23 , 2 , 5 , 80 , 89 , 51 , 21 , 96 , 91 , 13 , 71 , 82 , 65 , 63 , 11 , 17 , 94 , 81 , 74 , 4 , 97 , 1 , 39 , 3 , 28 , 8 , 84 , 90 , 47 , 85 , 7 , 56 , 49 , 93 , 33 , 12 , 19 , 60 , 86 , 100 , 44 , 45 , 36 , 72 , 95 , 77 , 34 , 92 , 24 , 73 , 18 , 38 , 43 , 26 , 41 , 69 , 67 , 57 , 9 , 27 , 66 , 87 , 46 , 35 , 59 , 70 , 10 , 20 , 53 , 15 , 32 , 98 , 68 , 31 , 54 , 25 , 83 , 88 , 22 , 48 , 29 , 37 , 6 , 78 , 99 , 30 },
460
+ }
461
+
462
+ program , err := expr .Compile (`sort(arr)` , expr .Env (env ))
463
+ require .NoError (b , err )
464
+
465
+ var out interface {}
466
+ b .ResetTimer ()
467
+ for n := 0 ; n < b .N ; n ++ {
468
+ out , _ = vm .Run (program , env )
469
+ }
470
+ b .StopTimer ()
471
+
472
+ require .Equal (b , 1 , out .([]any )[0 ])
473
+ require .Equal (b , 100 , out .([]any )[99 ])
474
+ }
475
+
476
+ func Benchmark_sortBy (b * testing.B ) {
477
+ type Foo struct {
478
+ Value int
479
+ }
480
+ arr := []any {55 , 58 , 42 , 61 , 75 , 52 , 64 , 62 , 16 , 79 , 40 , 14 , 50 , 76 , 23 , 2 , 5 , 80 , 89 , 51 , 21 , 96 , 91 , 13 , 71 , 82 , 65 , 63 , 11 , 17 , 94 , 81 , 74 , 4 , 97 , 1 , 39 , 3 , 28 , 8 , 84 , 90 , 47 , 85 , 7 , 56 , 49 , 93 , 33 , 12 , 19 , 60 , 86 , 100 , 44 , 45 , 36 , 72 , 95 , 77 , 34 , 92 , 24 , 73 , 18 , 38 , 43 , 26 , 41 , 69 , 67 , 57 , 9 , 27 , 66 , 87 , 46 , 35 , 59 , 70 , 10 , 20 , 53 , 15 , 32 , 98 , 68 , 31 , 54 , 25 , 83 , 88 , 22 , 48 , 29 , 37 , 6 , 78 , 99 , 30 }
481
+ env := map [string ]interface {}{
482
+ "arr" : make ([]Foo , len (arr )),
483
+ }
484
+ for i , v := range arr {
485
+ env ["arr" ].([]Foo )[i ] = Foo {Value : v .(int )}
486
+ }
487
+
488
+ program , err := expr .Compile (`sortBy(arr, "Value")` , expr .Env (env ))
489
+ require .NoError (b , err )
490
+
491
+ var out interface {}
492
+ b .ResetTimer ()
493
+ for n := 0 ; n < b .N ; n ++ {
494
+ out , _ = vm .Run (program , env )
495
+ }
496
+ b .StopTimer ()
497
+
498
+ require .Equal (b , 1 , out .([]any )[0 ].(Foo ).Value )
499
+ require .Equal (b , 100 , out .([]any )[99 ].(Foo ).Value )
500
+ }
0 commit comments