@@ -8,20 +8,20 @@ import (
8
8
"strconv"
9
9
"time"
10
10
11
- "github.com/evstack/ev-node/compression"
12
11
"github.com/evstack/ev-node/core/da"
12
+ "github.com/evstack/ev-node/da/compression"
13
13
)
14
14
15
15
// BenchmarkResult holds the results of a compression benchmark
16
16
type BenchmarkResult struct {
17
- Algorithm string
18
- Level int
19
- DataSize int
20
- CompressedSize int
21
- CompressionRatio float64
22
- CompressTime time.Duration
23
- DecompressTime time.Duration
24
- CompressionSpeed float64 // MB/s
17
+ Algorithm string
18
+ Level int
19
+ DataSize int
20
+ CompressedSize int
21
+ CompressionRatio float64
22
+ CompressTime time.Duration
23
+ DecompressTime time.Duration
24
+ CompressionSpeed float64 // MB/s
25
25
DecompressionSpeed float64 // MB/s
26
26
}
27
27
@@ -65,13 +65,13 @@ func generateTestData(dataType TestDataType, size int) da.Blob {
65
65
}
66
66
}
67
67
return data [:size ]
68
-
68
+
69
69
case Random :
70
70
// Random data that doesn't compress well
71
71
data := make ([]byte , size )
72
72
rand .Read (data )
73
73
return data
74
-
74
+
75
75
case JSON :
76
76
// JSON-like structured data
77
77
jsonTemplate := `{"id":%d,"name":"user_%d","email":"user%[email protected] ","data":"%s","timestamp":%d,"active":true}`
@@ -91,7 +91,7 @@ func generateTestData(dataType TestDataType, size int) da.Blob {
91
91
counter ++
92
92
}
93
93
return data [:min (len (data ), size )]
94
-
94
+
95
95
case Text :
96
96
// Natural language text (moderately compressible)
97
97
words := []string {
@@ -125,16 +125,16 @@ func runBenchmark(config compression.Config, testData da.Blob, iterations int) (
125
125
return nil , err
126
126
}
127
127
defer compressor .Close ()
128
-
128
+
129
129
// Warm up
130
130
_ , err = compression .CompressBlob (testData )
131
131
if err != nil {
132
132
return nil , err
133
133
}
134
-
134
+
135
135
var totalCompressTime , totalDecompressTime time.Duration
136
136
var compressedData da.Blob
137
-
137
+
138
138
// Run compression benchmark
139
139
for i := 0 ; i < iterations ; i ++ {
140
140
start := time .Now ()
@@ -144,7 +144,7 @@ func runBenchmark(config compression.Config, testData da.Blob, iterations int) (
144
144
}
145
145
totalCompressTime += time .Since (start )
146
146
}
147
-
147
+
148
148
// Run decompression benchmark
149
149
for i := 0 ; i < iterations ; i ++ {
150
150
start := time .Now ()
@@ -154,21 +154,21 @@ func runBenchmark(config compression.Config, testData da.Blob, iterations int) (
154
154
}
155
155
totalDecompressTime += time .Since (start )
156
156
}
157
-
157
+
158
158
avgCompressTime := totalCompressTime / time .Duration (iterations )
159
159
avgDecompressTime := totalDecompressTime / time .Duration (iterations )
160
-
160
+
161
161
compressionRatio := float64 (len (compressedData )) / float64 (len (testData ))
162
162
compressionSpeed := float64 (len (testData )) / 1024 / 1024 / avgCompressTime .Seconds ()
163
163
decompressionSpeed := float64 (len (testData )) / 1024 / 1024 / avgDecompressTime .Seconds ()
164
-
164
+
165
165
// Get actual compressed size (minus header)
166
166
info := compression .GetCompressionInfo (compressedData )
167
167
actualCompressedSize := int (info .CompressedSize )
168
168
if ! info .IsCompressed {
169
169
actualCompressedSize = int (info .OriginalSize )
170
170
}
171
-
171
+
172
172
return & BenchmarkResult {
173
173
Algorithm : "zstd" ,
174
174
Level : config .ZstdLevel ,
@@ -188,7 +188,7 @@ func printResults(dataType TestDataType, results []*BenchmarkResult) {
188
188
"Level" , "Size" , "Compressed" , "Ratio" , "Comp Time" , "Comp Speed" , "Decomp Time" , "Decomp Speed" )
189
189
fmt .Printf ("%-6s %-10s %-12s %-8s %-12s %-15s %-12s %-15s\n " ,
190
190
"-----" , "--------" , "----------" , "------" , "---------" , "-----------" , "----------" , "-------------" )
191
-
191
+
192
192
for _ , result := range results {
193
193
fmt .Printf ("%-6d %-10s %-12s %-8.3f %-12s %-15s %-12s %-15s\n " ,
194
194
result .Level ,
@@ -240,96 +240,95 @@ func min(a, b int) int {
240
240
func main () {
241
241
fmt .Println ("EV-Node Zstd Compression Benchmark" )
242
242
fmt .Println ("==================================" )
243
-
243
+
244
244
// Parse command line arguments
245
245
iterations := 100
246
246
if len (os .Args ) > 1 {
247
247
if i , err := strconv .Atoi (os .Args [1 ]); err == nil {
248
248
iterations = i
249
249
}
250
250
}
251
-
251
+
252
252
testSizes := []int {1024 , 4096 , 16384 , 65536 } // 1KB, 4KB, 16KB, 64KB
253
253
testDataTypes := []TestDataType {Repetitive , Text , JSON , Random }
254
254
zstdLevels := []int {1 , 3 , 6 , 9 } // Test different levels, highlighting level 3
255
-
255
+
256
256
fmt .Printf ("Running %d iterations per test\n " , iterations )
257
257
fmt .Printf ("Test sizes: %v\n " , testSizes )
258
258
fmt .Printf ("Zstd levels: %v (level 3 is recommended)\n " , zstdLevels )
259
-
259
+
260
260
for _ , dataType := range testDataTypes {
261
261
var allResults []* BenchmarkResult
262
-
262
+
263
263
for _ , size := range testSizes {
264
264
testData := generateTestData (dataType , size )
265
-
265
+
266
266
for _ , level := range zstdLevels {
267
267
config := compression.Config {
268
268
Enabled : true ,
269
269
ZstdLevel : level ,
270
270
MinCompressionRatio : 0.05 , // Allow more compression attempts for benchmarking
271
271
}
272
-
272
+
273
273
result , err := runBenchmark (config , testData , iterations )
274
274
if err != nil {
275
275
fmt .Printf ("Error benchmarking %s data (size: %d, level: %d): %v\n " ,
276
276
dataType , size , level , err )
277
277
continue
278
278
}
279
-
279
+
280
280
allResults = append (allResults , result )
281
281
}
282
282
}
283
-
283
+
284
284
printResults (dataType , allResults )
285
285
}
286
-
286
+
287
287
// Print recommendations
288
288
fmt .Printf ("\n === Recommendations ===\n " )
289
289
fmt .Printf ("• **Zstd Level 3**: Optimal balance of compression ratio and speed\n " )
290
290
fmt .Printf ("• **Best for EV-Node**: Fast compression (~100-200 MB/s) with good ratios (~20-40%%)\n " )
291
291
fmt .Printf ("• **Memory efficient**: Lower memory usage than higher compression levels\n " )
292
292
fmt .Printf ("• **Production ready**: Widely used default level in many applications\n " )
293
293
fmt .Printf ("\n " )
294
-
294
+
295
295
// Real-world example
296
296
fmt .Printf ("=== Real-World Example ===\n " )
297
297
realWorldData := generateTestData (JSON , 10240 ) // 10KB typical blob
298
- config := compression .DefaultConfig ()
299
-
298
+
300
299
start := time .Now ()
301
300
compressed , err := compression .CompressBlob (realWorldData )
302
301
compressTime := time .Since (start )
303
-
302
+
304
303
if err != nil {
305
304
fmt .Printf ("Error in real-world example: %v\n " , err )
306
305
return
307
306
}
308
-
307
+
309
308
start = time .Now ()
310
309
decompressed , err := compression .DecompressBlob (compressed )
311
310
decompressTime := time .Since (start )
312
-
311
+
313
312
if err != nil {
314
313
fmt .Printf ("Error decompressing: %v\n " , err )
315
314
return
316
315
}
317
-
316
+
318
317
if ! bytes .Equal (realWorldData , decompressed ) {
319
318
fmt .Printf ("Data integrity error!\n " )
320
319
return
321
320
}
322
-
321
+
323
322
info := compression .GetCompressionInfo (compressed )
324
-
323
+
325
324
fmt .Printf ("Original size: %s\n " , formatBytes (len (realWorldData )))
326
325
fmt .Printf ("Compressed size: %s\n " , formatBytes (int (info .CompressedSize )))
327
- fmt .Printf ("Compression ratio: %.1f%% (%.1f%% savings)\n " ,
326
+ fmt .Printf ("Compression ratio: %.1f%% (%.1f%% savings)\n " ,
328
327
info .CompressionRatio * 100 , (1 - info .CompressionRatio )* 100 )
329
328
fmt .Printf ("Compression time: %s\n " , formatDuration (compressTime ))
330
329
fmt .Printf ("Decompression time: %s\n " , formatDuration (decompressTime ))
331
- fmt .Printf ("Compression speed: %.1f MB/s\n " ,
330
+ fmt .Printf ("Compression speed: %.1f MB/s\n " ,
332
331
float64 (len (realWorldData ))/ 1024 / 1024 / compressTime .Seconds ())
333
- fmt .Printf ("Decompression speed: %.1f MB/s\n " ,
332
+ fmt .Printf ("Decompression speed: %.1f MB/s\n " ,
334
333
float64 (len (realWorldData ))/ 1024 / 1024 / decompressTime .Seconds ())
335
- }
334
+ }
0 commit comments