1
1
package main
2
2
3
3
import (
4
+ "bytes"
4
5
"flag"
5
6
"fmt"
6
7
"io"
7
8
"os"
9
+ "runtime"
8
10
"sync/atomic"
11
+ "time"
9
12
10
13
"code.cloudfoundry.org/bytefmt"
11
14
"github.com/schollz/progressbar/v3"
@@ -26,6 +29,7 @@ func Compress(fs *flag.FlagSet) cmdflag.Handler {
26
29
fs .UintVar (& level , "l" , 0 , "compression level (0=fastest)" )
27
30
var concurrency int
28
31
fs .IntVar (& concurrency , "c" , - 1 , "concurrency (default=all CPUs" )
32
+ bench := fs .Int ("bench" , 0 , "Run benchmark n times. No output will be written" )
29
33
30
34
var lvl lz4.CompressionLevel
31
35
switch level {
@@ -87,6 +91,33 @@ func Compress(fs *flag.FlagSet) cmdflag.Handler {
87
91
if err != nil {
88
92
return fidx , err
89
93
}
94
+ if * bench > 0 {
95
+ fmt .Print ("Reading " , filename , "..." )
96
+ input , err := io .ReadAll (file )
97
+ if err != nil {
98
+ return fidx , err
99
+ }
100
+ file .Close ()
101
+ for i := 0 ; i < * bench ; i ++ {
102
+ fmt .Print ("\n Compressing..." )
103
+ runtime .GC ()
104
+ start := time .Now ()
105
+ counter := wCounter {out : io .Discard }
106
+ zw .Reset (& counter )
107
+ _ , err := io .Copy (zw , bytes .NewReader (input ))
108
+ if err != nil {
109
+ return fidx , err
110
+ }
111
+ output := counter .n
112
+ elapsed := time .Since (start )
113
+ ms := elapsed .Round (time .Millisecond )
114
+ mbPerSec := (float64 (len (input )) / 1e6 ) / (float64 (elapsed ) / (float64 (time .Second )))
115
+ pct := float64 (output ) * 100 / float64 (len (input ))
116
+ fmt .Printf (" %d -> %d [%.02f%%]; %v, %.01fMB/s" , len (input ), output , pct , ms , mbPerSec )
117
+ }
118
+ fmt .Println ("" )
119
+ continue
120
+ }
90
121
finfo , err := file .Stat ()
91
122
if err != nil {
92
123
return fidx , err
@@ -147,3 +178,14 @@ func Compress(fs *flag.FlagSet) cmdflag.Handler {
147
178
return len (args ), nil
148
179
}
149
180
}
181
+
182
+ type wCounter struct {
183
+ n int
184
+ out io.Writer
185
+ }
186
+
187
+ func (w * wCounter ) Write (p []byte ) (n int , err error ) {
188
+ n , err = w .out .Write (p )
189
+ w .n += n
190
+ return n , err
191
+ }
0 commit comments