1 | import { _hb, _ms } from '@naturalcycles/js-lib'
|
2 | import { boldWhite, dimWhite } from '../../colors'
|
3 |
|
4 | export 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 |
|
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 |
|
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 | }
|