UNPKG

1.55 kBPlain TextView Raw
1import { _hb, _ms } from '@naturalcycles/js-lib'
2import { boldWhite, dimWhite } from '../../colors'
3
4export class NDJsonStats {
5 static create(o: Partial<NDJsonStats> = {}): NDJsonStats {
6 return Object.assign(new NDJsonStats(), o)
7 }
8
9 static empty(): NDJsonStats {
10 return new NDJsonStats()
11 }
12
13 static createCombined(stats: NDJsonStats[]): NDJsonStats {
14 // eslint-disable-next-line unicorn/no-array-reduce
15 return stats.reduce((statsTotal, stats) => statsTotal.add(stats), new NDJsonStats())
16 }
17
18 tookMillis = 0
19 rows = 0
20 sizeBytes = 0
21
22 get rpsTotal(): number {
23 return Math.round(this.rows / ((this.tookMillis || 1) / 1000))
24 }
25 get bpsTotal(): number {
26 return this.sizeBytes === 0 ? 0 : Math.round(this.sizeBytes / ((this.tookMillis || 1) / 1000))
27 }
28
29 get avgBytesPerRow(): number {
30 return Math.round(this.sizeBytes / this.rows)
31 }
32
33 /**
34 * Non-mutating addition, returns new object
35 */
36 add(s: NDJsonStats): NDJsonStats {
37 return NDJsonStats.create({
38 tookMillis: this.tookMillis + s.tookMillis,
39 rows: this.rows + s.rows,
40 sizeBytes: this.sizeBytes + s.sizeBytes,
41 })
42 }
43
44 toPretty(name?: string): string {
45 return [
46 `Processed ${name ? boldWhite(name) + ': ' : ''}${dimWhite(this.rows)} rows, ${dimWhite(
47 _hb(this.sizeBytes),
48 )} in ${dimWhite(_ms(this.tookMillis))}`,
49 `${dimWhite(this.rpsTotal + ' rows/sec')}`,
50 `${dimWhite(_hb(this.avgBytesPerRow) + '/row')}`,
51 `${dimWhite(_hb(this.bpsTotal) + '/sec')}`,
52 ].join(', ')
53 }
54}