-
Notifications
You must be signed in to change notification settings - Fork 0
/
1-compression-comparison.js
91 lines (79 loc) · 1.83 KB
/
1-compression-comparison.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import { createGzip, createBrotliCompress, createDeflate } from "zlib";
import { createReadStream } from "fs";
import { PassThrough, pipeline } from "stream";
import { hrtime } from "process";
const FORMATS = ["gzip", "brotli", "deflate"];
const sizes = {
original: 0,
gzip: 0,
brotli: 0,
deflate: 0,
};
const times = {
gzip: 0,
brotli: 0,
deflate: 0,
};
const _startTimeStamps = {
gzip: 0,
brotli: 0,
deflate: 0,
};
const zlibLibraries = {
gzip: createGzip,
brotli: createBrotliCompress,
deflate: createDeflate,
};
const monitor = (key) => {
let stream = new PassThrough();
stream.on("data", (chunk) => {
sizes[key] += chunk.length;
});
return stream;
};
const startTimer = (key) => {
let stream = PassThrough();
stream.once("data", () => {
_startTimeStamps[key] = hrtime.bigint();
});
return stream;
};
const endTimer = (key) => {
let stream = PassThrough();
stream.on("end", () => {
let t = _startTimeStamps[key];
times[key] = hrtime.bigint() - t;
});
return stream;
};
const overFlow = () => PassThrough({ highWaterMark: Number.MAX_SAFE_INTEGER });
let streams = 3;
const done = (err) => {
if (err) {
console.error("Pipeline failed.", err);
process.exit(1);
}
if (--streams === 0) {
console.log("Space Efficency:");
FORMATS.forEach((format) =>
console.log(`${format}:\t\t${(sizes[format] / sizes.original) * 100}%`)
);
console.log("Time Efficency:");
FORMATS.forEach((format) => {
console.log(`${format}:\t\t${times[format]}ns`);
});
}
};
const file = createReadStream("./file");
const measureOriginalFile = file.pipe(monitor("original"));
FORMATS.forEach((format) => {
pipeline(
measureOriginalFile,
overFlow(),
startTimer(format),
zlibLibraries[format](),
endTimer(format),
monitor(format),
done
);
});