@@ -177,67 +177,39 @@ var defaultFilterOptions = []filterOption{
177177 {name : "av" , onlyAV : true },
178178}
179179
180- func parseFilterOptions (keys []string ) []filterOption {
181- for _ , key := range keys {
182- if key == "" {
183- continue
184- }
185- val := strings .TrimSpace (os .Getenv (key ))
186- if val == "" {
187- continue
188- }
189- var opts []filterOption
190- seen := make (map [string ]struct {})
191- for _ , part := range strings .Split (val , "," ) {
192- switch strings .ToLower (strings .TrimSpace (part )) {
193- case "all" :
194- if _ , ok := seen ["all" ]; ! ok {
195- opts = append (opts , filterOption {name : "all" , onlyAV : false })
196- seen ["all" ] = struct {}{}
197- }
198- case "av" , "onlyav" , "votes" :
199- if _ , ok := seen ["av" ]; ! ok {
200- opts = append (opts , filterOption {name : "av" , onlyAV : true })
201- seen ["av" ] = struct {}{}
202- }
203- }
204- }
205- if len (opts ) > 0 {
206- return opts
180+ func parseFilterOptions (key string ) []filterOption {
181+ val := strings .TrimSpace (os .Getenv (key ))
182+ var opts []filterOption
183+ for _ , part := range strings .Split (val , "," ) {
184+ switch strings .ToLower (strings .TrimSpace (part )) {
185+ case "all" :
186+ opts = append (opts , filterOption {name : "all" , onlyAV : false })
187+ case "av" :
188+ opts = append (opts , filterOption {name : "av" , onlyAV : true })
207189 }
208190 }
191+ if len (opts ) > 0 {
192+ return opts
193+ }
209194 return defaultFilterOptions
210195}
211196
212- func parseIntListFromEnv (keys []string , defaults []int ) []int {
213- for _ , key := range keys {
214- if key == "" {
197+ func parseIntListFromEnv (key string , defaults []int ) []int {
198+ val := strings .TrimSpace (os .Getenv (key ))
199+ var parsed []int
200+ for _ , part := range strings .Split (val , "," ) {
201+ numStr := strings .TrimSpace (part )
202+ if numStr == "" {
215203 continue
216204 }
217- val := strings . TrimSpace ( os . Getenv ( key ) )
218- if val == "" {
205+ num , err := strconv . Atoi ( numStr )
206+ if err != nil {
219207 continue
220208 }
221- var parsed []int
222- seen := make (map [int ]struct {})
223- for _ , part := range strings .Split (val , "," ) {
224- numStr := strings .TrimSpace (part )
225- if numStr == "" {
226- continue
227- }
228- num , err := strconv .Atoi (numStr )
229- if err != nil {
230- continue
231- }
232- if _ , ok := seen [num ]; ok {
233- continue
234- }
235- seen [num ] = struct {}{}
236- parsed = append (parsed , num )
237- }
238- if len (parsed ) > 0 {
239- return parsed
240- }
209+ parsed = append (parsed , num )
210+ }
211+ if len (parsed ) > 0 {
212+ return parsed
241213 }
242214 return defaults
243215}
@@ -342,104 +314,60 @@ func runDecompressionLoop(b *testing.B, compressed [][]byte, decompress simpleDe
342314 }
343315}
344316
345- type levelWindowLog struct {
346- level int
347- windowLog int
348- }
349-
350317type levelWindow struct {
351318 level int
352319 window int
353320}
354321
355- // parseConfigFromEnv parses configuration from environment variables with a generic two-field struct
356- func parseConfigFromEnv [T comparable ](keys []string , defaults []T , parse func (field1 , field2 string ) (T , error )) []T {
357- for _ , key := range keys {
358- if key == "" {
322+ func parseLevelWindows (key string , defaults []levelWindow ) []levelWindow {
323+ val := strings .TrimSpace (os .Getenv (key ))
324+ var result []levelWindow
325+ for _ , part := range strings .Split (val , "," ) {
326+ fields := strings .Split (part , ":" )
327+ if len (fields ) != 2 {
359328 continue
360329 }
361- val := strings .TrimSpace (os .Getenv (key ))
362- if val == "" {
330+ level , err1 := strconv .Atoi (strings .TrimSpace (fields [0 ]))
331+ window , err2 := strconv .Atoi (strings .TrimSpace (fields [1 ]))
332+ if err1 != nil || err2 != nil {
363333 continue
364334 }
365- var result []T
366- seen := make (map [T ]struct {})
367- for _ , part := range strings .Split (val , "," ) {
368- fields := strings .Split (part , ":" )
369- if len (fields ) != 2 {
370- continue
371- }
372- cfg , err := parse (strings .TrimSpace (fields [0 ]), strings .TrimSpace (fields [1 ]))
373- if err != nil {
374- continue
375- }
376- if _ , ok := seen [cfg ]; ok {
377- continue
378- }
379- seen [cfg ] = struct {}{}
380- result = append (result , cfg )
381- }
382- if len (result ) > 0 {
383- return result
384- }
335+ result = append (result , levelWindow {level : level , window : window })
336+ }
337+ if len (result ) > 0 {
338+ return result
385339 }
386340 return defaults
387341}
388342
389- func parseLevelWindowLogList (keys []string , defaults []levelWindowLog ) []levelWindowLog {
390- return parseConfigFromEnv (keys , defaults , func (f1 , f2 string ) (levelWindowLog , error ) {
391- level , err1 := strconv .Atoi (f1 )
392- windowLog , err2 := strconv .Atoi (f2 )
393- if err1 != nil {
394- return levelWindowLog {}, err1
395- }
396- if err2 != nil {
397- return levelWindowLog {}, err2
398- }
399- return levelWindowLog {level : level , windowLog : windowLog }, nil
400- })
401- }
402-
403- func parseLevelWindowList (keys []string , defaults []levelWindow ) []levelWindow {
404- return parseConfigFromEnv (keys , defaults , func (f1 , f2 string ) (levelWindow , error ) {
405- level , err1 := strconv .Atoi (f1 )
406- window , err2 := strconv .Atoi (f2 )
407- if err1 != nil {
408- return levelWindow {}, err1
409- }
410- if err2 != nil {
411- return levelWindow {}, err2
412- }
413- return levelWindow {level : level , window : window }, nil
414- })
415- }
416-
417343var (
418- // Default compression levels for benchmarks
419- defaultLevels = []int {1 , 3 }
420- defaultLevelsExtend = []int {1 , 3 , 7 , 11 }
421-
422- // Default window configurations for benchmarks
423- defaultWindowLog = []levelWindowLog {
424- {level : 1 , windowLog : 15 },
425- {level : 1 , windowLog : 18 },
426- {level : 1 , windowLog : 20 },
427- {level : 3 , windowLog : 15 },
428- {level : 3 , windowLog : 18 },
429- {level : 3 , windowLog : 20 },
430- {level : 7 , windowLog : 18 },
431- {level : 11 , windowLog : 18 },
432- }
433- defaultWindows = []levelWindow {
434- {level : 1 , window : 1 << 12 },
435- {level : 1 , window : 1 << 15 },
436- {level : 1 , window : 1 << 18 },
437- {level : 1 , window : 1 << 20 },
438- {level : 2 , window : 1 << 15 },
439- {level : 2 , window : 1 << 18 },
440- {level : 2 , window : 1 << 20 },
441- {level : 3 , window : 1 << 18 },
442- {level : 3 , window : 1 << 20 },
344+ // Default compression levels for klauspost benchmarks
345+ defaultKlauspostLevels = []int {1 , 3 }
346+ // Default compression levels for zstd benchmarks (gozstd and datadog)
347+ defaultZstdLevels = []int {1 , 3 , 7 , 11 }
348+
349+ // Default windowLog configurations for gozstd benchmarks
350+ defaultGozstdWindowLog = []levelWindow {
351+ {level : 1 , window : 15 },
352+ {level : 1 , window : 18 },
353+ {level : 1 , window : 20 },
354+ {level : 3 , window : 15 },
355+ {level : 3 , window : 18 },
356+ {level : 3 , window : 20 },
357+ {level : 7 , window : 18 },
358+ {level : 11 , window : 18 },
359+ }
360+ // Default windowLog configurations for klauspost benchmarks
361+ defaultKlauspostWindowLog = []levelWindow {
362+ {level : 1 , window : 12 },
363+ {level : 1 , window : 15 },
364+ {level : 1 , window : 18 },
365+ {level : 1 , window : 20 },
366+ {level : 2 , window : 15 },
367+ {level : 2 , window : 18 },
368+ {level : 2 , window : 20 },
369+ {level : 3 , window : 18 },
370+ {level : 3 , window : 20 },
443371 }
444372)
445373
@@ -648,11 +576,12 @@ func benchmarkGozstdWindow(b *testing.B, level int, windowLog int) {
648576
649577// benchmarkKlauspostWindow benchmarks the Klauspost zstd implementation
650578// with specific window size (one encoder for all messages, resetting window after each)
651- func benchmarkKlauspostWindow (b * testing.B , level int , windowSize int ) {
579+ func benchmarkKlauspostWindow (b * testing.B , level int , windowLog int ) {
652580 corpus := loadTestCorpus (b )
653581
654582 filtered := filterMessages (b , corpus , false )
655583
584+ windowSize := 1 << windowLog
656585 enc , err := kzstd .NewWriter (nil , kzstd .WithEncoderLevel (kzstd .EncoderLevel (level )),
657586 kzstd .WithWindowSize (windowSize ))
658587 if err != nil {
@@ -668,11 +597,12 @@ func benchmarkKlauspostWindow(b *testing.B, level int, windowSize int) {
668597
669598// benchmarkKlauspostStream benchmarks the Klauspost zstd implementation
670599// with a streaming approach (accumulating context across messages)
671- func benchmarkKlauspostStream (b * testing.B , level int , windowSize int ) {
600+ func benchmarkKlauspostStream (b * testing.B , level int , windowLog int ) {
672601 corpus := loadTestCorpus (b )
673602
674603 filtered := filterMessages (b , corpus , false )
675604
605+ windowSize := 1 << windowLog
676606 var buf bytes.Buffer
677607 enc , err := kzstd .NewWriter (& buf ,
678608 kzstd .WithEncoderLevel (kzstd .EncoderLevel (level )),
@@ -743,7 +673,7 @@ func benchmarkVPackDynamicHelper(b *testing.B, windowSize int) {
743673// BenchmarkVPackDynamicCompression benchmarks the stateful vpack compression implementation
744674// This uses the two-layer compression: StatelessEncoder → StatefulEncoder
745675func BenchmarkVPackDynamicCompression (b * testing.B ) {
746- windowSizes := parseIntListFromEnv ([] string { "ALGODUMP_VPACK_WINDOWS" } , []int {1024 })
676+ windowSizes := parseIntListFromEnv ("ALGODUMP_VPACK_WINDOWS" , []int {1024 })
747677 for _ , windowSize := range windowSizes {
748678 b .Run (fmt .Sprintf ("window=%d" , windowSize ), func (b * testing.B ) {
749679 benchmarkVPackDynamicHelper (b , windowSize )
@@ -828,8 +758,8 @@ func BenchmarkVPackDynamicDecompression(b *testing.B) {
828758
829759func BenchmarkGozstdSimple (b * testing.B ) {
830760 corpus := loadTestCorpus (b )
831- levels := parseIntListFromEnv ([] string { "ALGODUMP_GOZSTD_LEVELS" , "ALGODUMP_BENCH_LEVELS" }, defaultLevelsExtend )
832- filters := parseFilterOptions ([] string { "ALGODUMP_GOZSTD_FILTERS" , " ALGODUMP_BENCH_FILTERS"} )
761+ levels := parseIntListFromEnv ("ALGODUMP_GOZSTD_LEVELS" , defaultZstdLevels )
762+ filters := parseFilterOptions (" ALGODUMP_BENCH_FILTERS" )
833763 runSimpleCompressionMatrix (b , "gozstd/simple" , corpus , levels , filters , func (level int ) (simpleCompressor , func (), error ) {
834764 return func (dst , src []byte ) ([]byte , error ) {
835765 return gozstd .CompressLevel (dst [:0 ], src , level ), nil
@@ -839,8 +769,8 @@ func BenchmarkGozstdSimple(b *testing.B) {
839769
840770func BenchmarkZstdSimple (b * testing.B ) {
841771 corpus := loadTestCorpus (b )
842- levels := parseIntListFromEnv ([] string { "ALGODUMP_ZSTD_LEVELS" , "ALGODUMP_BENCH_LEVELS" }, defaultLevelsExtend )
843- filters := parseFilterOptions ([] string { "ALGODUMP_ZSTD_FILTERS" , " ALGODUMP_BENCH_FILTERS"} )
772+ levels := parseIntListFromEnv ("ALGODUMP_ZSTD_LEVELS" , defaultZstdLevels )
773+ filters := parseFilterOptions (" ALGODUMP_BENCH_FILTERS" )
844774 runSimpleCompressionMatrix (b , "zstd/simple" , corpus , levels , filters , func (level int ) (simpleCompressor , func (), error ) {
845775 return func (dst , src []byte ) ([]byte , error ) {
846776 return zstd .CompressLevel (dst [:0 ], src , level )
@@ -850,8 +780,8 @@ func BenchmarkZstdSimple(b *testing.B) {
850780
851781func BenchmarkKlauspostSimple (b * testing.B ) {
852782 corpus := loadTestCorpus (b )
853- levels := parseIntListFromEnv ([] string { "ALGODUMP_KLAUSPOST_LEVELS" , "ALGODUMP_BENCH_LEVELS" }, defaultLevels )
854- filters := parseFilterOptions ([] string { "ALGODUMP_KLAUSPOST_FILTERS" , " ALGODUMP_BENCH_FILTERS"} )
783+ levels := parseIntListFromEnv ("ALGODUMP_KLAUSPOST_LEVELS" , defaultKlauspostLevels )
784+ filters := parseFilterOptions (" ALGODUMP_BENCH_FILTERS" )
855785 runSimpleCompressionMatrix (b , "klauspost/simple" , corpus , levels , filters , func (level int ) (simpleCompressor , func (), error ) {
856786 enc , err := kzstd .NewWriter (nil , kzstd .WithEncoderLevel (kzstd .EncoderLevel (level )))
857787 if err != nil {
@@ -867,8 +797,8 @@ func BenchmarkKlauspostSimple(b *testing.B) {
867797
868798func BenchmarkGozstdDecompress (b * testing.B ) {
869799 corpus := loadTestCorpus (b )
870- levels := parseIntListFromEnv ([] string { "ALGODUMP_GOZSTD_LEVELS" , "ALGODUMP_BENCH_LEVELS" }, defaultLevelsExtend )
871- filters := parseFilterOptions ([] string { "ALGODUMP_GOZSTD_FILTERS" , " ALGODUMP_BENCH_FILTERS"} )
800+ levels := parseIntListFromEnv ("ALGODUMP_GOZSTD_LEVELS" , defaultZstdLevels )
801+ filters := parseFilterOptions (" ALGODUMP_BENCH_FILTERS" )
872802 runSimpleDecompressionMatrix (b , "gozstd/decompress" , corpus , levels , filters , func (level int , msgs []StoredMessage ) ([][]byte , simpleDecompressor , func (), error ) {
873803 compressed := make ([][]byte , len (msgs ))
874804 for i , msg := range msgs {
@@ -883,8 +813,8 @@ func BenchmarkGozstdDecompress(b *testing.B) {
883813
884814func BenchmarkZstdDecompress (b * testing.B ) {
885815 corpus := loadTestCorpus (b )
886- levels := parseIntListFromEnv ([] string { "ALGODUMP_ZSTD_LEVELS" , "ALGODUMP_BENCH_LEVELS" }, defaultLevelsExtend )
887- filters := parseFilterOptions ([] string { "ALGODUMP_ZSTD_FILTERS" , " ALGODUMP_BENCH_FILTERS"} )
816+ levels := parseIntListFromEnv ("ALGODUMP_ZSTD_LEVELS" , defaultZstdLevels )
817+ filters := parseFilterOptions (" ALGODUMP_BENCH_FILTERS" )
888818 runSimpleDecompressionMatrix (b , "zstd/decompress" , corpus , levels , filters , func (level int , msgs []StoredMessage ) ([][]byte , simpleDecompressor , func (), error ) {
889819 compressed := make ([][]byte , len (msgs ))
890820 for i , msg := range msgs {
@@ -903,8 +833,8 @@ func BenchmarkZstdDecompress(b *testing.B) {
903833
904834func BenchmarkKlauspostDecompress (b * testing.B ) {
905835 corpus := loadTestCorpus (b )
906- levels := parseIntListFromEnv ([] string { "ALGODUMP_KLAUSPOST_LEVELS" , "ALGODUMP_BENCH_LEVELS" }, defaultLevels )
907- filters := parseFilterOptions ([] string { "ALGODUMP_KLAUSPOST_FILTERS" , " ALGODUMP_BENCH_FILTERS"} )
836+ levels := parseIntListFromEnv ("ALGODUMP_KLAUSPOST_LEVELS" , defaultKlauspostLevels )
837+ filters := parseFilterOptions (" ALGODUMP_BENCH_FILTERS" )
908838 runSimpleDecompressionMatrix (b , "klauspost/decompress" , corpus , levels , filters , func (level int , msgs []StoredMessage ) ([][]byte , simpleDecompressor , func (), error ) {
909839 enc , err := kzstd .NewWriter (nil , kzstd .WithEncoderLevel (kzstd .EncoderLevel (level )))
910840 if err != nil {
@@ -931,27 +861,27 @@ func BenchmarkKlauspostDecompress(b *testing.B) {
931861}
932862
933863func BenchmarkGozstdWindow (b * testing.B ) {
934- configs := parseLevelWindowLogList ([] string { "ALGODUMP_GOZSTD_WINDOW_LOGS" , "ALGODUMP_BENCH_WINDOW_LOGS" }, defaultWindowLog )
864+ configs := parseLevelWindows ( "ALGODUMP_GOZSTD_WINDOW_LOGS" , defaultGozstdWindowLog )
935865 for _ , cfg := range configs {
936- b .Run (fmt .Sprintf ("gozstd/window/level=%d/windowLog=%d" , cfg .level , cfg .windowLog ), func (b * testing.B ) {
937- benchmarkGozstdWindow (b , cfg .level , cfg .windowLog )
866+ b .Run (fmt .Sprintf ("gozstd/window/level=%d/windowLog=%d" , cfg .level , cfg .window ), func (b * testing.B ) {
867+ benchmarkGozstdWindow (b , cfg .level , cfg .window )
938868 })
939869 }
940870}
941871
942872func BenchmarkKlauspostWindow (b * testing.B ) {
943- configs := parseLevelWindowList ([] string { "ALGODUMP_KLAUSPOST_WINDOWS " , "ALGODUMP_BENCH_WINDOWS" }, defaultWindows )
873+ configs := parseLevelWindows ( "ALGODUMP_KLAUSPOST_WINDOW_LOGS " , defaultKlauspostWindowLog )
944874 for _ , cfg := range configs {
945- b .Run (fmt .Sprintf ("klauspost/window/level=%d/window =%d" , cfg .level , cfg .window ), func (b * testing.B ) {
875+ b .Run (fmt .Sprintf ("klauspost/window/level=%d/windowLog =%d" , cfg .level , cfg .window ), func (b * testing.B ) {
946876 benchmarkKlauspostWindow (b , cfg .level , cfg .window )
947877 })
948878 }
949879}
950880
951881func BenchmarkKlauspostStream (b * testing.B ) {
952- configs := parseLevelWindowList ([] string { "ALGODUMP_KLAUSPOST_STREAM_WINDOWS " , "ALGODUMP_BENCH_STREAM_WINDOWS" }, defaultWindows )
882+ configs := parseLevelWindows ( "ALGODUMP_KLAUSPOST_STREAM_WINDOW_LOGS " , defaultKlauspostWindowLog )
953883 for _ , cfg := range configs {
954- b .Run (fmt .Sprintf ("klauspost/stream/level=%d/window =%d" , cfg .level , cfg .window ), func (b * testing.B ) {
884+ b .Run (fmt .Sprintf ("klauspost/stream/level=%d/windowLog =%d" , cfg .level , cfg .window ), func (b * testing.B ) {
955885 benchmarkKlauspostStream (b , cfg .level , cfg .window )
956886 })
957887 }
0 commit comments