@nestia/benchmark 0.1.1 → 0.2.0-dev.20240725
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/DynamicBenchmarker.d.ts +15 -0
- package/lib/DynamicBenchmarker.js +35 -78
- package/lib/DynamicBenchmarker.js.map +1 -1
- package/lib/internal/DynamicBenchmarkReporter.d.ts +4 -0
- package/lib/internal/DynamicBenchmarkReporter.js +127 -0
- package/lib/internal/DynamicBenchmarkReporter.js.map +1 -0
- package/package.json +7 -7
- package/src/DynamicBenchmarker.ts +38 -82
- package/src/internal/DynamicBenchmarkReporter.ts +99 -0
|
@@ -77,6 +77,16 @@ export declare namespace DynamicBenchmarker {
|
|
|
77
77
|
* @param complete The number of completed requests.
|
|
78
78
|
*/
|
|
79
79
|
progress?: (complete: number) => void;
|
|
80
|
+
/**
|
|
81
|
+
* Get memory usage.
|
|
82
|
+
*
|
|
83
|
+
* Get the memory usage of the master program.
|
|
84
|
+
*
|
|
85
|
+
* Specify this property only when your backend server is running on
|
|
86
|
+
* a different process, so that need to measure the memory usage of
|
|
87
|
+
* the backend server from other process.
|
|
88
|
+
*/
|
|
89
|
+
memory?: () => Promise<NodeJS.MemoryUsage>;
|
|
80
90
|
/**
|
|
81
91
|
* Standard I/O option.
|
|
82
92
|
*
|
|
@@ -130,6 +140,7 @@ export declare namespace DynamicBenchmarker {
|
|
|
130
140
|
completed_at: string;
|
|
131
141
|
statistics: IReport.IStatistics;
|
|
132
142
|
endpoints: Array<IReport.IEndpoint & IReport.IStatistics>;
|
|
143
|
+
memories: IReport.IMemory[];
|
|
133
144
|
}
|
|
134
145
|
namespace IReport {
|
|
135
146
|
interface IEndpoint {
|
|
@@ -144,6 +155,10 @@ export declare namespace DynamicBenchmarker {
|
|
|
144
155
|
minimum: number | null;
|
|
145
156
|
maximum: number | null;
|
|
146
157
|
}
|
|
158
|
+
interface IMemory {
|
|
159
|
+
time: string;
|
|
160
|
+
usage: NodeJS.MemoryUsage;
|
|
161
|
+
}
|
|
147
162
|
}
|
|
148
163
|
/**
|
|
149
164
|
* Master program.
|
|
@@ -111,9 +111,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
111
111
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
112
112
|
exports.DynamicBenchmarker = void 0;
|
|
113
113
|
var fs_1 = __importDefault(require("fs"));
|
|
114
|
-
var os_1 = __importDefault(require("os"));
|
|
115
114
|
var tgrid_1 = require("tgrid");
|
|
116
115
|
var tstl_1 = require("tstl");
|
|
116
|
+
var DynamicBenchmarkReporter_1 = require("./internal/DynamicBenchmarkReporter");
|
|
117
117
|
/**
|
|
118
118
|
* Dynamic benchmark executor running prefixed functions.
|
|
119
119
|
*
|
|
@@ -158,7 +158,7 @@ var DynamicBenchmarker;
|
|
|
158
158
|
* @returns Benchmark report
|
|
159
159
|
*/
|
|
160
160
|
DynamicBenchmarker.master = function (props) { return __awaiter(_this, void 0, void 0, function () {
|
|
161
|
-
var completes, servants, started_at,
|
|
161
|
+
var completes, servants, started_at, memories, completed_at, events, endpoints, events_1, events_1_1, e;
|
|
162
162
|
var e_1, _a;
|
|
163
163
|
var _this = this;
|
|
164
164
|
var _b;
|
|
@@ -190,6 +190,37 @@ var DynamicBenchmarker;
|
|
|
190
190
|
case 1:
|
|
191
191
|
servants = _c.sent();
|
|
192
192
|
started_at = new Date();
|
|
193
|
+
memories = [];
|
|
194
|
+
completed_at = null;
|
|
195
|
+
(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
196
|
+
var getter, _a, _b;
|
|
197
|
+
var _c;
|
|
198
|
+
var _this = this;
|
|
199
|
+
var _d;
|
|
200
|
+
return __generator(this, function (_e) {
|
|
201
|
+
switch (_e.label) {
|
|
202
|
+
case 0:
|
|
203
|
+
getter = (_d = props.memory) !== null && _d !== void 0 ? _d : (function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
204
|
+
return [2 /*return*/, process.memoryUsage()];
|
|
205
|
+
}); }); });
|
|
206
|
+
_e.label = 1;
|
|
207
|
+
case 1:
|
|
208
|
+
if (!(completed_at === null)) return [3 /*break*/, 4];
|
|
209
|
+
return [4 /*yield*/, (0, tstl_1.sleep_for)(1000)];
|
|
210
|
+
case 2:
|
|
211
|
+
_e.sent();
|
|
212
|
+
_b = (_a = memories).push;
|
|
213
|
+
_c = {};
|
|
214
|
+
return [4 /*yield*/, getter()];
|
|
215
|
+
case 3:
|
|
216
|
+
_b.apply(_a, [(_c.usage = _e.sent(),
|
|
217
|
+
_c.time = new Date().toISOString(),
|
|
218
|
+
_c)]);
|
|
219
|
+
return [3 /*break*/, 1];
|
|
220
|
+
case 4: return [2 /*return*/];
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
}); })().catch(function () { });
|
|
193
224
|
return [4 /*yield*/, Promise.all(servants.map(function (connector) {
|
|
194
225
|
return connector.getDriver().execute({
|
|
195
226
|
count: Math.ceil(props.count / props.threads),
|
|
@@ -231,6 +262,7 @@ var DynamicBenchmarker;
|
|
|
231
262
|
endpoints: __spreadArray([], __read(endpoints), false).map(function (it) { return (__assign(__assign({}, statistics(it.second)), it.first)); }),
|
|
232
263
|
started_at: started_at.toISOString(),
|
|
233
264
|
completed_at: completed_at.toISOString(),
|
|
265
|
+
memories: memories,
|
|
234
266
|
}];
|
|
235
267
|
}
|
|
236
268
|
});
|
|
@@ -268,82 +300,7 @@ var DynamicBenchmarker;
|
|
|
268
300
|
* @returns Markdown content
|
|
269
301
|
*/
|
|
270
302
|
DynamicBenchmarker.markdown = function (report) {
|
|
271
|
-
|
|
272
|
-
return value === null ? "N/A" : (Math.floor(value * 100) / 100).toLocaleString();
|
|
273
|
-
};
|
|
274
|
-
var writeHead = function () {
|
|
275
|
-
return [
|
|
276
|
-
"Type",
|
|
277
|
-
"Count",
|
|
278
|
-
"Success",
|
|
279
|
-
"Mean.",
|
|
280
|
-
"Stdev.",
|
|
281
|
-
"Minimum",
|
|
282
|
-
"Maximum",
|
|
283
|
-
].join(" | ") +
|
|
284
|
-
"\n" +
|
|
285
|
-
new Array(7).fill("----").join("|");
|
|
286
|
-
};
|
|
287
|
-
var writeRow = function (title, s) {
|
|
288
|
-
return [
|
|
289
|
-
title,
|
|
290
|
-
s.count.toLocaleString(),
|
|
291
|
-
s.success.toLocaleString(),
|
|
292
|
-
format(s.mean),
|
|
293
|
-
format(s.stdev),
|
|
294
|
-
format(s.minimum),
|
|
295
|
-
format(s.maximum),
|
|
296
|
-
].join(" | ");
|
|
297
|
-
};
|
|
298
|
-
return __spreadArray(__spreadArray(__spreadArray([
|
|
299
|
-
"# Benchmark Report",
|
|
300
|
-
"> Generated by [`@nestia/e2e`](https://github.com/samchon/nestia)",
|
|
301
|
-
"",
|
|
302
|
-
" - Specifications",
|
|
303
|
-
" - CPU: ".concat(os_1.default.cpus()[0].model),
|
|
304
|
-
" - RAM: ".concat(Math.floor(os_1.default.totalmem() / 1024 / 1024 / 1024).toLocaleString(), " GB"),
|
|
305
|
-
" - NodeJS Version: ".concat(process.version),
|
|
306
|
-
" - Backend Server: 1 core / 1 thread",
|
|
307
|
-
" - Arguments",
|
|
308
|
-
" - Count: ".concat(report.count.toLocaleString()),
|
|
309
|
-
" - Threads: ".concat(report.threads.toLocaleString()),
|
|
310
|
-
" - Simultaneous: ".concat(report.simultaneous.toLocaleString()),
|
|
311
|
-
" - Time",
|
|
312
|
-
" - Start: ".concat(report.started_at),
|
|
313
|
-
" - Complete: ".concat(report.completed_at),
|
|
314
|
-
" - Elapsed: ".concat((new Date(report.completed_at).getTime() - new Date(report.started_at).getTime()).toLocaleString(), " ms"),
|
|
315
|
-
"",
|
|
316
|
-
writeHead(),
|
|
317
|
-
writeRow("Total", report.statistics),
|
|
318
|
-
"",
|
|
319
|
-
"> Unit: milliseconds",
|
|
320
|
-
"",
|
|
321
|
-
"## Endpoints",
|
|
322
|
-
writeHead()
|
|
323
|
-
], __read(report.endpoints
|
|
324
|
-
.slice()
|
|
325
|
-
.sort(function (a, b) { var _a, _b; return ((_a = b.mean) !== null && _a !== void 0 ? _a : 0) - ((_b = a.mean) !== null && _b !== void 0 ? _b : 0); })
|
|
326
|
-
.map(function (endpoint) {
|
|
327
|
-
return writeRow("".concat(endpoint.method, " ").concat(endpoint.path), endpoint);
|
|
328
|
-
})), false), [
|
|
329
|
-
"",
|
|
330
|
-
"> Unit: milliseconds",
|
|
331
|
-
"",
|
|
332
|
-
"## Failures",
|
|
333
|
-
"Method | Path | Count | Failures",
|
|
334
|
-
"-------|------|-------|----------"
|
|
335
|
-
], false), __read(report.endpoints
|
|
336
|
-
.filter(function (e) { return e.success !== e.count; })
|
|
337
|
-
.slice()
|
|
338
|
-
.sort(function (a, b) { return b.count - a.count; })
|
|
339
|
-
.map(function (e) {
|
|
340
|
-
return [
|
|
341
|
-
e.method,
|
|
342
|
-
e.path,
|
|
343
|
-
e.count.toLocaleString(),
|
|
344
|
-
(e.count - e.success).toLocaleString(),
|
|
345
|
-
].join(" | ");
|
|
346
|
-
})), false).join("\n");
|
|
303
|
+
return DynamicBenchmarkReporter_1.DynamicBenchmarWriter.markdown(report);
|
|
347
304
|
};
|
|
348
305
|
var execute = function (ctx) {
|
|
349
306
|
return function (mass) { return __awaiter(_this, void 0, void 0, function () {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicBenchmarker.js","sourceRoot":"","sources":["../src/DynamicBenchmarker.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,0CAAoB;AACpB
|
|
1
|
+
{"version":3,"file":"DynamicBenchmarker.js","sourceRoot":"","sources":["../src/DynamicBenchmarker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
3
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
4
|
+
if (!m) return o;
|
|
5
|
+
var i = m.call(o), r, ar = [], e;
|
|
6
|
+
try {
|
|
7
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
8
|
+
}
|
|
9
|
+
catch (error) { e = { error: error }; }
|
|
10
|
+
finally {
|
|
11
|
+
try {
|
|
12
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
13
|
+
}
|
|
14
|
+
finally { if (e) throw e.error; }
|
|
15
|
+
}
|
|
16
|
+
return ar;
|
|
17
|
+
};
|
|
18
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
19
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
20
|
+
if (ar || !(i in from)) {
|
|
21
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
22
|
+
ar[i] = from[i];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
26
|
+
};
|
|
27
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
28
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
29
|
+
};
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.DynamicBenchmarWriter = void 0;
|
|
32
|
+
var os_1 = __importDefault(require("os"));
|
|
33
|
+
var DynamicBenchmarWriter;
|
|
34
|
+
(function (DynamicBenchmarWriter) {
|
|
35
|
+
DynamicBenchmarWriter.markdown = function (report) {
|
|
36
|
+
var format = function (value) {
|
|
37
|
+
return value === null ? "N/A" : (Math.floor(value * 100) / 100).toLocaleString();
|
|
38
|
+
};
|
|
39
|
+
var writeHead = function () {
|
|
40
|
+
return [
|
|
41
|
+
"Type",
|
|
42
|
+
"Count",
|
|
43
|
+
"Success",
|
|
44
|
+
"Mean.",
|
|
45
|
+
"Stdev.",
|
|
46
|
+
"Minimum",
|
|
47
|
+
"Maximum",
|
|
48
|
+
].join(" | ") +
|
|
49
|
+
"\n" +
|
|
50
|
+
new Array(7).fill("----").join("|");
|
|
51
|
+
};
|
|
52
|
+
var writeRow = function (title, s) {
|
|
53
|
+
return [
|
|
54
|
+
title,
|
|
55
|
+
s.count.toLocaleString(),
|
|
56
|
+
s.success.toLocaleString(),
|
|
57
|
+
format(s.mean),
|
|
58
|
+
format(s.stdev),
|
|
59
|
+
format(s.minimum),
|
|
60
|
+
format(s.maximum),
|
|
61
|
+
].join(" | ");
|
|
62
|
+
};
|
|
63
|
+
return __spreadArray(__spreadArray(__spreadArray([
|
|
64
|
+
"# Benchmark Report",
|
|
65
|
+
"> Generated by [`@nestia/benchmark`](https://github.com/samchon/nestia)",
|
|
66
|
+
"",
|
|
67
|
+
" - Specifications",
|
|
68
|
+
" - CPU: ".concat(os_1.default.cpus()[0].model),
|
|
69
|
+
" - RAM: ".concat(Math.floor(os_1.default.totalmem() / 1024 / 1024 / 1024).toLocaleString(), " GB"),
|
|
70
|
+
" - NodeJS Version: ".concat(process.version),
|
|
71
|
+
" - Backend Server: 1 core / 1 thread",
|
|
72
|
+
" - Arguments",
|
|
73
|
+
" - Count: ".concat(report.count.toLocaleString()),
|
|
74
|
+
" - Threads: ".concat(report.threads.toLocaleString()),
|
|
75
|
+
" - Simultaneous: ".concat(report.simultaneous.toLocaleString()),
|
|
76
|
+
" - Time",
|
|
77
|
+
" - Start: ".concat(report.started_at),
|
|
78
|
+
" - Complete: ".concat(report.completed_at),
|
|
79
|
+
" - Elapsed: ".concat((new Date(report.completed_at).getTime() - new Date(report.started_at).getTime()).toLocaleString(), " ms"),
|
|
80
|
+
"",
|
|
81
|
+
writeHead(),
|
|
82
|
+
writeRow("Total", report.statistics),
|
|
83
|
+
"",
|
|
84
|
+
"> Unit: milliseconds",
|
|
85
|
+
"",
|
|
86
|
+
"## Endpoints",
|
|
87
|
+
writeHead()
|
|
88
|
+
], __read(report.endpoints
|
|
89
|
+
.slice()
|
|
90
|
+
.sort(function (a, b) { var _a, _b; return ((_a = b.mean) !== null && _a !== void 0 ? _a : 0) - ((_b = a.mean) !== null && _b !== void 0 ? _b : 0); })
|
|
91
|
+
.map(function (endpoint) {
|
|
92
|
+
return writeRow("".concat(endpoint.method, " ").concat(endpoint.path), endpoint);
|
|
93
|
+
})), false), [
|
|
94
|
+
"",
|
|
95
|
+
"> Unit: milliseconds",
|
|
96
|
+
"",
|
|
97
|
+
chart(report.memories),
|
|
98
|
+
"## Failures",
|
|
99
|
+
"Method | Path | Count | Failures",
|
|
100
|
+
"-------|------|-------|----------"
|
|
101
|
+
], false), __read(report.endpoints
|
|
102
|
+
.filter(function (e) { return e.success !== e.count; })
|
|
103
|
+
.slice()
|
|
104
|
+
.sort(function (a, b) { return b.count - a.count; })
|
|
105
|
+
.map(function (e) {
|
|
106
|
+
return [
|
|
107
|
+
e.method,
|
|
108
|
+
e.path,
|
|
109
|
+
e.count.toLocaleString(),
|
|
110
|
+
(e.count - e.success).toLocaleString(),
|
|
111
|
+
].join(" | ");
|
|
112
|
+
})), false).join("\n");
|
|
113
|
+
};
|
|
114
|
+
var chart = function (memories) {
|
|
115
|
+
return [
|
|
116
|
+
"## Memory Usage",
|
|
117
|
+
"```mermaid",
|
|
118
|
+
"xychart-beta",
|
|
119
|
+
" title Memory Usage",
|
|
120
|
+
" x-axis \"Time (s)\"",
|
|
121
|
+
" y-axis \"Memory (MB)\"",
|
|
122
|
+
" line [".concat(memories.map(function (m) { return Math.floor((m.usage.heapUsed + m.usage.external) / Math.pow(1024, 2)); }).join(", "), "]"),
|
|
123
|
+
"```",
|
|
124
|
+
].join("\n");
|
|
125
|
+
};
|
|
126
|
+
})(DynamicBenchmarWriter || (exports.DynamicBenchmarWriter = DynamicBenchmarWriter = {}));
|
|
127
|
+
//# sourceMappingURL=DynamicBenchmarkReporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DynamicBenchmarkReporter.js","sourceRoot":"","sources":["../../src/internal/DynamicBenchmarkReporter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nestia/benchmark",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0-dev.20240725",
|
|
4
4
|
"description": "NestJS Performance Benchmark Program",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"typings": "lib/index.d.ts",
|
|
@@ -22,23 +22,23 @@
|
|
|
22
22
|
"author": "Jeongho Nam",
|
|
23
23
|
"license": "MIT",
|
|
24
24
|
"devDependencies": {
|
|
25
|
-
"@nestia/core": "^3.
|
|
25
|
+
"@nestia/core": "^3.8.1",
|
|
26
26
|
"@nestia/e2e": "^0.7.0",
|
|
27
|
-
"@nestia/sdk": "^3.
|
|
27
|
+
"@nestia/sdk": "^3.8.1",
|
|
28
28
|
"@nestjs/common": "^10.3.10",
|
|
29
29
|
"@nestjs/core": "^10.3.10",
|
|
30
30
|
"@nestjs/platform-express": "^10.3.10",
|
|
31
31
|
"@types/uuid": "^10.0.0",
|
|
32
|
-
"nestia": "^5.
|
|
32
|
+
"nestia": "^5.5.0",
|
|
33
33
|
"ts-node": "^10.9.2",
|
|
34
34
|
"ts-patch": "^3.2.1",
|
|
35
|
-
"typescript": "^5.5.
|
|
35
|
+
"typescript": "^5.5.4",
|
|
36
36
|
"typescript-transform-paths": "^3.4.7",
|
|
37
|
-
"typia": "^6.4
|
|
37
|
+
"typia": "^6.5.4",
|
|
38
38
|
"uuid": "^10.0.0"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@nestia/fetcher": "^3.
|
|
41
|
+
"@nestia/fetcher": "^3.8.1",
|
|
42
42
|
"tgrid": "^1.0.2",
|
|
43
43
|
"tstl": "^3.0.0"
|
|
44
44
|
},
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { IConnection } from "@nestia/fetcher";
|
|
2
2
|
import fs from "fs";
|
|
3
|
-
import os from "os";
|
|
4
3
|
import { Driver, WorkerConnector, WorkerServer } from "tgrid";
|
|
5
|
-
import { HashMap, hash } from "tstl";
|
|
4
|
+
import { HashMap, hash, sleep_for } from "tstl";
|
|
6
5
|
|
|
7
6
|
import { IBenchmarkEvent } from "./IBenchmarkEvent";
|
|
7
|
+
import { DynamicBenchmarWriter } from "./internal/DynamicBenchmarkReporter";
|
|
8
8
|
import { IBenchmarkMaster } from "./internal/IBenchmarkMaster";
|
|
9
9
|
import { IBenchmarkServant } from "./internal/IBenchmarkServant";
|
|
10
10
|
|
|
@@ -89,6 +89,17 @@ export namespace DynamicBenchmarker {
|
|
|
89
89
|
*/
|
|
90
90
|
progress?: (complete: number) => void;
|
|
91
91
|
|
|
92
|
+
/**
|
|
93
|
+
* Get memory usage.
|
|
94
|
+
*
|
|
95
|
+
* Get the memory usage of the master program.
|
|
96
|
+
*
|
|
97
|
+
* Specify this property only when your backend server is running on
|
|
98
|
+
* a different process, so that need to measure the memory usage of
|
|
99
|
+
* the backend server from other process.
|
|
100
|
+
*/
|
|
101
|
+
memory?: () => Promise<NodeJS.MemoryUsage>;
|
|
102
|
+
|
|
92
103
|
/**
|
|
93
104
|
* Standard I/O option.
|
|
94
105
|
*
|
|
@@ -147,6 +158,7 @@ export namespace DynamicBenchmarker {
|
|
|
147
158
|
completed_at: string;
|
|
148
159
|
statistics: IReport.IStatistics;
|
|
149
160
|
endpoints: Array<IReport.IEndpoint & IReport.IStatistics>;
|
|
161
|
+
memories: IReport.IMemory[];
|
|
150
162
|
}
|
|
151
163
|
export namespace IReport {
|
|
152
164
|
export interface IEndpoint {
|
|
@@ -161,6 +173,10 @@ export namespace DynamicBenchmarker {
|
|
|
161
173
|
minimum: number | null;
|
|
162
174
|
maximum: number | null;
|
|
163
175
|
}
|
|
176
|
+
export interface IMemory {
|
|
177
|
+
time: string;
|
|
178
|
+
usage: NodeJS.MemoryUsage;
|
|
179
|
+
}
|
|
164
180
|
}
|
|
165
181
|
|
|
166
182
|
/**
|
|
@@ -202,7 +218,22 @@ export namespace DynamicBenchmarker {
|
|
|
202
218
|
return connector;
|
|
203
219
|
}),
|
|
204
220
|
);
|
|
221
|
+
|
|
205
222
|
const started_at: Date = new Date();
|
|
223
|
+
const memories: IReport.IMemory[] = [];
|
|
224
|
+
let completed_at: Date | null = null;
|
|
225
|
+
|
|
226
|
+
(async () => {
|
|
227
|
+
const getter = props.memory ?? (async () => process.memoryUsage());
|
|
228
|
+
while (completed_at === null) {
|
|
229
|
+
await sleep_for(1_000);
|
|
230
|
+
memories.push({
|
|
231
|
+
usage: await getter(),
|
|
232
|
+
time: new Date().toISOString(),
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
})().catch(() => {});
|
|
236
|
+
|
|
206
237
|
const events: IBenchmarkEvent[] = (
|
|
207
238
|
await Promise.all(
|
|
208
239
|
servants.map((connector) =>
|
|
@@ -213,7 +244,8 @@ export namespace DynamicBenchmarker {
|
|
|
213
244
|
),
|
|
214
245
|
)
|
|
215
246
|
).flat();
|
|
216
|
-
|
|
247
|
+
|
|
248
|
+
completed_at = new Date();
|
|
217
249
|
await Promise.all(servants.map((connector) => connector.close()));
|
|
218
250
|
if (props.progress) props.progress(props.count);
|
|
219
251
|
|
|
@@ -243,6 +275,7 @@ export namespace DynamicBenchmarker {
|
|
|
243
275
|
})),
|
|
244
276
|
started_at: started_at.toISOString(),
|
|
245
277
|
completed_at: completed_at.toISOString(),
|
|
278
|
+
memories,
|
|
246
279
|
};
|
|
247
280
|
};
|
|
248
281
|
|
|
@@ -274,85 +307,8 @@ export namespace DynamicBenchmarker {
|
|
|
274
307
|
* @param report Benchmark report
|
|
275
308
|
* @returns Markdown content
|
|
276
309
|
*/
|
|
277
|
-
export const markdown = (report: DynamicBenchmarker.IReport): string =>
|
|
278
|
-
|
|
279
|
-
value === null ? "N/A" : (Math.floor(value * 100) / 100).toLocaleString();
|
|
280
|
-
const writeHead = () =>
|
|
281
|
-
[
|
|
282
|
-
"Type",
|
|
283
|
-
"Count",
|
|
284
|
-
"Success",
|
|
285
|
-
"Mean.",
|
|
286
|
-
"Stdev.",
|
|
287
|
-
"Minimum",
|
|
288
|
-
"Maximum",
|
|
289
|
-
].join(" | ") +
|
|
290
|
-
"\n" +
|
|
291
|
-
new Array(7).fill("----").join("|");
|
|
292
|
-
const writeRow = (
|
|
293
|
-
title: string,
|
|
294
|
-
s: DynamicBenchmarker.IReport.IStatistics,
|
|
295
|
-
) =>
|
|
296
|
-
[
|
|
297
|
-
title,
|
|
298
|
-
s.count.toLocaleString(),
|
|
299
|
-
s.success.toLocaleString(),
|
|
300
|
-
format(s.mean),
|
|
301
|
-
format(s.stdev),
|
|
302
|
-
format(s.minimum),
|
|
303
|
-
format(s.maximum),
|
|
304
|
-
].join(" | ");
|
|
305
|
-
return [
|
|
306
|
-
`# Benchmark Report`,
|
|
307
|
-
"> Generated by [`@nestia/e2e`](https://github.com/samchon/nestia)",
|
|
308
|
-
``,
|
|
309
|
-
` - Specifications`,
|
|
310
|
-
` - CPU: ${os.cpus()[0].model}`,
|
|
311
|
-
` - RAM: ${Math.floor(os.totalmem() / 1024 / 1024 / 1024).toLocaleString()} GB`,
|
|
312
|
-
` - NodeJS Version: ${process.version}`,
|
|
313
|
-
` - Backend Server: 1 core / 1 thread`,
|
|
314
|
-
` - Arguments`,
|
|
315
|
-
` - Count: ${report.count.toLocaleString()}`,
|
|
316
|
-
` - Threads: ${report.threads.toLocaleString()}`,
|
|
317
|
-
` - Simultaneous: ${report.simultaneous.toLocaleString()}`,
|
|
318
|
-
` - Time`,
|
|
319
|
-
` - Start: ${report.started_at}`,
|
|
320
|
-
` - Complete: ${report.completed_at}`,
|
|
321
|
-
` - Elapsed: ${(new Date(report.completed_at).getTime() - new Date(report.started_at).getTime()).toLocaleString()} ms`,
|
|
322
|
-
``,
|
|
323
|
-
writeHead(),
|
|
324
|
-
writeRow("Total", report.statistics),
|
|
325
|
-
"",
|
|
326
|
-
"> Unit: milliseconds",
|
|
327
|
-
"",
|
|
328
|
-
"## Endpoints",
|
|
329
|
-
writeHead(),
|
|
330
|
-
...report.endpoints
|
|
331
|
-
.slice()
|
|
332
|
-
.sort((a, b) => (b.mean ?? 0) - (a.mean ?? 0))
|
|
333
|
-
.map((endpoint) =>
|
|
334
|
-
writeRow(`${endpoint.method} ${endpoint.path}`, endpoint),
|
|
335
|
-
),
|
|
336
|
-
"",
|
|
337
|
-
"> Unit: milliseconds",
|
|
338
|
-
"",
|
|
339
|
-
"## Failures",
|
|
340
|
-
"Method | Path | Count | Failures",
|
|
341
|
-
"-------|------|-------|----------",
|
|
342
|
-
...report.endpoints
|
|
343
|
-
.filter((e) => e.success !== e.count)
|
|
344
|
-
.slice()
|
|
345
|
-
.sort((a, b) => b.count - a.count)
|
|
346
|
-
.map((e) =>
|
|
347
|
-
[
|
|
348
|
-
e.method,
|
|
349
|
-
e.path,
|
|
350
|
-
e.count.toLocaleString(),
|
|
351
|
-
(e.count - e.success).toLocaleString(),
|
|
352
|
-
].join(" | "),
|
|
353
|
-
),
|
|
354
|
-
].join("\n");
|
|
355
|
-
};
|
|
310
|
+
export const markdown = (report: DynamicBenchmarker.IReport): string =>
|
|
311
|
+
DynamicBenchmarWriter.markdown(report);
|
|
356
312
|
|
|
357
313
|
const execute =
|
|
358
314
|
<Parameters extends any[]>(ctx: {
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import os from "os";
|
|
2
|
+
|
|
3
|
+
import { DynamicBenchmarker } from "../DynamicBenchmarker";
|
|
4
|
+
|
|
5
|
+
export namespace DynamicBenchmarWriter {
|
|
6
|
+
export const markdown = (report: DynamicBenchmarker.IReport): string => {
|
|
7
|
+
const format = (value: number | null) =>
|
|
8
|
+
value === null ? "N/A" : (Math.floor(value * 100) / 100).toLocaleString();
|
|
9
|
+
const writeHead = () =>
|
|
10
|
+
[
|
|
11
|
+
"Type",
|
|
12
|
+
"Count",
|
|
13
|
+
"Success",
|
|
14
|
+
"Mean.",
|
|
15
|
+
"Stdev.",
|
|
16
|
+
"Minimum",
|
|
17
|
+
"Maximum",
|
|
18
|
+
].join(" | ") +
|
|
19
|
+
"\n" +
|
|
20
|
+
new Array(7).fill("----").join("|");
|
|
21
|
+
const writeRow = (
|
|
22
|
+
title: string,
|
|
23
|
+
s: DynamicBenchmarker.IReport.IStatistics,
|
|
24
|
+
) =>
|
|
25
|
+
[
|
|
26
|
+
title,
|
|
27
|
+
s.count.toLocaleString(),
|
|
28
|
+
s.success.toLocaleString(),
|
|
29
|
+
format(s.mean),
|
|
30
|
+
format(s.stdev),
|
|
31
|
+
format(s.minimum),
|
|
32
|
+
format(s.maximum),
|
|
33
|
+
].join(" | ");
|
|
34
|
+
return [
|
|
35
|
+
`# Benchmark Report`,
|
|
36
|
+
"> Generated by [`@nestia/benchmark`](https://github.com/samchon/nestia)",
|
|
37
|
+
``,
|
|
38
|
+
` - Specifications`,
|
|
39
|
+
` - CPU: ${os.cpus()[0].model}`,
|
|
40
|
+
` - RAM: ${Math.floor(os.totalmem() / 1024 / 1024 / 1024).toLocaleString()} GB`,
|
|
41
|
+
` - NodeJS Version: ${process.version}`,
|
|
42
|
+
` - Backend Server: 1 core / 1 thread`,
|
|
43
|
+
` - Arguments`,
|
|
44
|
+
` - Count: ${report.count.toLocaleString()}`,
|
|
45
|
+
` - Threads: ${report.threads.toLocaleString()}`,
|
|
46
|
+
` - Simultaneous: ${report.simultaneous.toLocaleString()}`,
|
|
47
|
+
` - Time`,
|
|
48
|
+
` - Start: ${report.started_at}`,
|
|
49
|
+
` - Complete: ${report.completed_at}`,
|
|
50
|
+
` - Elapsed: ${(new Date(report.completed_at).getTime() - new Date(report.started_at).getTime()).toLocaleString()} ms`,
|
|
51
|
+
``,
|
|
52
|
+
writeHead(),
|
|
53
|
+
writeRow("Total", report.statistics),
|
|
54
|
+
"",
|
|
55
|
+
"> Unit: milliseconds",
|
|
56
|
+
"",
|
|
57
|
+
"## Endpoints",
|
|
58
|
+
writeHead(),
|
|
59
|
+
...report.endpoints
|
|
60
|
+
.slice()
|
|
61
|
+
.sort((a, b) => (b.mean ?? 0) - (a.mean ?? 0))
|
|
62
|
+
.map((endpoint) =>
|
|
63
|
+
writeRow(`${endpoint.method} ${endpoint.path}`, endpoint),
|
|
64
|
+
),
|
|
65
|
+
"",
|
|
66
|
+
"> Unit: milliseconds",
|
|
67
|
+
"",
|
|
68
|
+
chart(report.memories),
|
|
69
|
+
"## Failures",
|
|
70
|
+
"Method | Path | Count | Failures",
|
|
71
|
+
"-------|------|-------|----------",
|
|
72
|
+
...report.endpoints
|
|
73
|
+
.filter((e) => e.success !== e.count)
|
|
74
|
+
.slice()
|
|
75
|
+
.sort((a, b) => b.count - a.count)
|
|
76
|
+
.map((e) =>
|
|
77
|
+
[
|
|
78
|
+
e.method,
|
|
79
|
+
e.path,
|
|
80
|
+
e.count.toLocaleString(),
|
|
81
|
+
(e.count - e.success).toLocaleString(),
|
|
82
|
+
].join(" | "),
|
|
83
|
+
),
|
|
84
|
+
].join("\n");
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const chart = (memories: DynamicBenchmarker.IReport.IMemory[]): string => {
|
|
88
|
+
return [
|
|
89
|
+
"## Memory Usage",
|
|
90
|
+
"```mermaid",
|
|
91
|
+
"xychart-beta",
|
|
92
|
+
" title Memory Usage",
|
|
93
|
+
` x-axis "Time (s)"`,
|
|
94
|
+
` y-axis "Memory (MB)"`,
|
|
95
|
+
` line [${memories.map((m) => Math.floor((m.usage.heapUsed + m.usage.external) / 1024 ** 2)).join(", ")}]`,
|
|
96
|
+
"```",
|
|
97
|
+
].join("\n");
|
|
98
|
+
};
|
|
99
|
+
}
|