Codebase list golang-github-vbauerster-mpb / 86bcfb9
refactoring speed: unit is either [0|SizeB1024(0)|SizeB1000(0)] Vladimir Bauer 3 years ago
2 changed file(s) with 86 addition(s) and 81 deletion(s). Raw diff Collapse all Expand all
33 "fmt"
44 "io"
55 "math"
6 "strings"
67 "time"
78
89 "github.com/VividCortex/ewma"
3839 // EwmaSpeed exponential-weighted-moving-average based speed decorator.
3940 // For this decorator to work correctly you have to measure each iteration's
4041 // duration and pass it to one of the (*Bar).EwmaIncr... family methods.
41 func EwmaSpeed(unit int, format string, age float64, wcc ...WC) Decorator {
42 func EwmaSpeed(unit interface{}, format string, age float64, wcc ...WC) Decorator {
4243 var average ewma.MovingAverage
4344 if age == 0 {
4445 average = ewma.NewMovingAverage()
5152 // MovingAverageSpeed decorator relies on MovingAverage implementation
5253 // to calculate its average.
5354 //
54 // `unit` one of [0|UnitKiB|UnitKB] zero for no unit
55 // `unit` one of [0|SizeB1024(0)|SizeB1000(0)]
5556 //
5657 // `format` printf compatible verb for value, like "%f" or "%d"
5758 //
6162 //
6263 // format examples:
6364 //
64 // unit=UnitKiB, format="%.1f" output: "1.0MiB/s"
65 // unit=UnitKiB, format="% .1f" output: "1.0 MiB/s"
66 // unit=UnitKB, format="%.1f" output: "1.0MB/s"
67 // unit=UnitKB, format="% .1f" output: "1.0 MB/s"
68 func MovingAverageSpeed(unit int, format string, average ewma.MovingAverage, wcc ...WC) Decorator {
65 // unit=SizeB1024(0), format="%.1f" output: "1.0MiB/s"
66 // unit=SizeB1024(0), format="% .1f" output: "1.0 MiB/s"
67 // unit=SizeB1000(0), format="%.1f" output: "1.0MB/s"
68 // unit=SizeB1000(0), format="% .1f" output: "1.0 MB/s"
69 func MovingAverageSpeed(unit interface{}, format string, average ewma.MovingAverage, wcc ...WC) Decorator {
6970 if format == "" {
7071 format = "%.0f"
72 } else if strings.Count(format, "%") != 1 {
73 panic("expected format with exactly 1 verb")
7174 }
7275 d := &movingAverageSpeed{
7376 WC: initWC(wcc...),
112115 // NewAverageSpeed decorator with dynamic unit measure adjustment and
113116 // user provided start time.
114117 //
115 // `unit` one of [0|UnitKiB|UnitKB] zero for no unit
118 // `unit` one of [0|SizeB1024(0)|SizeB1000(0)]
116119 //
117120 // `format` printf compatible verb for value, like "%f" or "%d"
118121 //
122125 //
123126 // format examples:
124127 //
125 // unit=UnitKiB, format="%.1f" output: "1.0MiB/s"
126 // unit=UnitKiB, format="% .1f" output: "1.0 MiB/s"
127 // unit=UnitKB, format="%.1f" output: "1.0MB/s"
128 // unit=UnitKB, format="% .1f" output: "1.0 MB/s"
129 func NewAverageSpeed(unit int, format string, startTime time.Time, wcc ...WC) Decorator {
128 // unit=SizeB1024(0), format="%.1f" output: "1.0MiB/s"
129 // unit=SizeB1024(0), format="% .1f" output: "1.0 MiB/s"
130 // unit=SizeB1000(0), format="%.1f" output: "1.0MB/s"
131 // unit=SizeB1000(0), format="% .1f" output: "1.0 MB/s"
132 func NewAverageSpeed(unit interface{}, format string, startTime time.Time, wcc ...WC) Decorator {
130133 if format == "" {
131134 format = "%.0f"
135 } else if strings.Count(format, "%") != 1 {
136 panic("expected format with exactly 1 verb")
132137 }
133138 d := &averageSpeed{
134139 WC: initWC(wcc...),
158163 d.startTime = startTime
159164 }
160165
161 func chooseSpeedProducer(unit int, format string) func(float64) string {
162 switch unit {
163 case UnitKiB:
166 func chooseSpeedProducer(unit interface{}, format string) func(float64) string {
167 switch unit.(type) {
168 case SizeB1024:
164169 return func(speed float64) string {
165170 return fmt.Sprintf(format, FmtAsSpeed(SizeB1024(math.Round(speed))))
166171 }
167 case UnitKB:
172 case SizeB1000:
168173 return func(speed float64) string {
169174 return fmt.Sprintf(format, FmtAsSpeed(SizeB1000(math.Round(speed))))
170175 }
88 cases := []struct {
99 name string
1010 fmt string
11 unit int
11 unit interface{}
1212 current int64
1313 elapsed time.Duration
1414 expected string
1515 }{
1616 {
1717 name: "empty fmt",
18 unit: UnitKiB,
18 unit: SizeB1024(0),
1919 fmt: "",
2020 current: 0,
2121 elapsed: time.Second,
2222 expected: "0b/s",
2323 },
2424 {
25 name: "UnitKiB:%d:0b",
26 unit: UnitKiB,
27 fmt: "%d",
28 current: 0,
29 elapsed: time.Second,
30 expected: "0b/s",
31 },
32 {
33 name: "UnitKiB:% .2f:0b",
34 unit: UnitKiB,
25 name: "SizeB1024(0):%d:0b",
26 unit: SizeB1024(0),
27 fmt: "%d",
28 current: 0,
29 elapsed: time.Second,
30 expected: "0b/s",
31 },
32 {
33 name: "SizeB1024(0):% .2f:0b",
34 unit: SizeB1024(0),
3535 fmt: "% .2f",
3636 current: 0,
3737 elapsed: time.Second,
3838 expected: "0.00 b/s",
3939 },
4040 {
41 name: "UnitKiB:%d:1b",
42 unit: UnitKiB,
41 name: "SizeB1024(0):%d:1b",
42 unit: SizeB1024(0),
4343 fmt: "%d",
4444 current: 1,
4545 elapsed: time.Second,
4646 expected: "1b/s",
4747 },
4848 {
49 name: "UnitKiB:% .2f:1b",
50 unit: UnitKiB,
49 name: "SizeB1024(0):% .2f:1b",
50 unit: SizeB1024(0),
5151 fmt: "% .2f",
5252 current: 1,
5353 elapsed: time.Second,
5454 expected: "1.00 b/s",
5555 },
5656 {
57 name: "UnitKiB:%d:KiB",
58 unit: UnitKiB,
57 name: "SizeB1024(0):%d:KiB",
58 unit: SizeB1024(0),
5959 fmt: "%d",
6060 current: 2 * int64(_iKiB),
6161 elapsed: 1 * time.Second,
6262 expected: "2KiB/s",
6363 },
6464 {
65 name: "UnitKiB:% .f:KiB",
66 unit: UnitKiB,
65 name: "SizeB1024(0):% .f:KiB",
66 unit: SizeB1024(0),
6767 fmt: "% .2f",
6868 current: 2 * int64(_iKiB),
6969 elapsed: 1 * time.Second,
7070 expected: "2.00 KiB/s",
7171 },
7272 {
73 name: "UnitKiB:%d:MiB",
74 unit: UnitKiB,
73 name: "SizeB1024(0):%d:MiB",
74 unit: SizeB1024(0),
7575 fmt: "%d",
7676 current: 2 * int64(_iMiB),
7777 elapsed: 1 * time.Second,
7878 expected: "2MiB/s",
7979 },
8080 {
81 name: "UnitKiB:% .2f:MiB",
82 unit: UnitKiB,
81 name: "SizeB1024(0):% .2f:MiB",
82 unit: SizeB1024(0),
8383 fmt: "% .2f",
8484 current: 2 * int64(_iMiB),
8585 elapsed: 1 * time.Second,
8686 expected: "2.00 MiB/s",
8787 },
8888 {
89 name: "UnitKiB:%d:GiB",
90 unit: UnitKiB,
89 name: "SizeB1024(0):%d:GiB",
90 unit: SizeB1024(0),
9191 fmt: "%d",
9292 current: 2 * int64(_iGiB),
9393 elapsed: 1 * time.Second,
9494 expected: "2GiB/s",
9595 },
9696 {
97 name: "UnitKiB:% .2f:GiB",
98 unit: UnitKiB,
97 name: "SizeB1024(0):% .2f:GiB",
98 unit: SizeB1024(0),
9999 fmt: "% .2f",
100100 current: 2 * int64(_iGiB),
101101 elapsed: 1 * time.Second,
102102 expected: "2.00 GiB/s",
103103 },
104104 {
105 name: "UnitKiB:%d:TiB",
106 unit: UnitKiB,
105 name: "SizeB1024(0):%d:TiB",
106 unit: SizeB1024(0),
107107 fmt: "%d",
108108 current: 2 * int64(_iTiB),
109109 elapsed: 1 * time.Second,
110110 expected: "2TiB/s",
111111 },
112112 {
113 name: "UnitKiB:% .2f:TiB",
114 unit: UnitKiB,
113 name: "SizeB1024(0):% .2f:TiB",
114 unit: SizeB1024(0),
115115 fmt: "% .2f",
116116 current: 2 * int64(_iTiB),
117117 elapsed: 1 * time.Second,
136136 cases := []struct {
137137 name string
138138 fmt string
139 unit int
139 unit interface{}
140140 current int64
141141 elapsed time.Duration
142142 expected string
143143 }{
144144 {
145145 name: "empty fmt",
146 unit: UnitKB,
146 unit: SizeB1000(0),
147147 fmt: "",
148148 current: 0,
149149 elapsed: time.Second,
150150 expected: "0b/s",
151151 },
152152 {
153 name: "UnitKB:%d:0b",
154 unit: UnitKB,
155 fmt: "%d",
156 current: 0,
157 elapsed: time.Second,
158 expected: "0b/s",
159 },
160 {
161 name: "UnitKB:% .2f:0b",
162 unit: UnitKB,
153 name: "SizeB1000(0):%d:0b",
154 unit: SizeB1000(0),
155 fmt: "%d",
156 current: 0,
157 elapsed: time.Second,
158 expected: "0b/s",
159 },
160 {
161 name: "SizeB1000(0):% .2f:0b",
162 unit: SizeB1000(0),
163163 fmt: "% .2f",
164164 current: 0,
165165 elapsed: time.Second,
166166 expected: "0.00 b/s",
167167 },
168168 {
169 name: "UnitKB:%d:1b",
170 unit: UnitKB,
169 name: "SizeB1000(0):%d:1b",
170 unit: SizeB1000(0),
171171 fmt: "%d",
172172 current: 1,
173173 elapsed: time.Second,
174174 expected: "1b/s",
175175 },
176176 {
177 name: "UnitKB:% .2f:1b",
178 unit: UnitKB,
177 name: "SizeB1000(0):% .2f:1b",
178 unit: SizeB1000(0),
179179 fmt: "% .2f",
180180 current: 1,
181181 elapsed: time.Second,
182182 expected: "1.00 b/s",
183183 },
184184 {
185 name: "UnitKB:%d:KB",
186 unit: UnitKB,
185 name: "SizeB1000(0):%d:KB",
186 unit: SizeB1000(0),
187187 fmt: "%d",
188188 current: 2 * int64(_KB),
189189 elapsed: 1 * time.Second,
190190 expected: "2KB/s",
191191 },
192192 {
193 name: "UnitKB:% .f:KB",
194 unit: UnitKB,
193 name: "SizeB1000(0):% .f:KB",
194 unit: SizeB1000(0),
195195 fmt: "% .2f",
196196 current: 2 * int64(_KB),
197197 elapsed: 1 * time.Second,
198198 expected: "2.00 KB/s",
199199 },
200200 {
201 name: "UnitKB:%d:MB",
202 unit: UnitKB,
201 name: "SizeB1000(0):%d:MB",
202 unit: SizeB1000(0),
203203 fmt: "%d",
204204 current: 2 * int64(_MB),
205205 elapsed: 1 * time.Second,
206206 expected: "2MB/s",
207207 },
208208 {
209 name: "UnitKB:% .2f:MB",
210 unit: UnitKB,
209 name: "SizeB1000(0):% .2f:MB",
210 unit: SizeB1000(0),
211211 fmt: "% .2f",
212212 current: 2 * int64(_MB),
213213 elapsed: 1 * time.Second,
214214 expected: "2.00 MB/s",
215215 },
216216 {
217 name: "UnitKB:%d:GB",
218 unit: UnitKB,
217 name: "SizeB1000(0):%d:GB",
218 unit: SizeB1000(0),
219219 fmt: "%d",
220220 current: 2 * int64(_GB),
221221 elapsed: 1 * time.Second,
222222 expected: "2GB/s",
223223 },
224224 {
225 name: "UnitKB:% .2f:GB",
226 unit: UnitKB,
225 name: "SizeB1000(0):% .2f:GB",
226 unit: SizeB1000(0),
227227 fmt: "% .2f",
228228 current: 2 * int64(_GB),
229229 elapsed: 1 * time.Second,
230230 expected: "2.00 GB/s",
231231 },
232232 {
233 name: "UnitKB:%d:TB",
234 unit: UnitKB,
233 name: "SizeB1000(0):%d:TB",
234 unit: SizeB1000(0),
235235 fmt: "%d",
236236 current: 2 * int64(_TB),
237237 elapsed: 1 * time.Second,
238238 expected: "2TB/s",
239239 },
240240 {
241 name: "UnitKB:% .2f:TB",
242 unit: UnitKB,
241 name: "SizeB1000(0):% .2f:TB",
242 unit: SizeB1000(0),
243243 fmt: "% .2f",
244244 current: 2 * int64(_TB),
245245 elapsed: 1 * time.Second,