@nestia/e2e 0.5.0-dev.20240617-4 → 0.5.0-dev.20240617-6
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.
|
@@ -19,7 +19,13 @@ import { IBenchmarkServant } from "./structures/IBenchmarkServant";
|
|
|
19
19
|
* the path of the servant program to the
|
|
20
20
|
* {@link DynamicBenchmarker.IMasterProps.servant} property.
|
|
21
21
|
*
|
|
22
|
-
*
|
|
22
|
+
* Also, you when you complete the benchmark execution through the
|
|
23
|
+
* {@link DynamicBenchmarker.master} and {@link DynamicBenchmarker.servant}
|
|
24
|
+
* functions, you can convert the result to markdown content by using the
|
|
25
|
+
* {@link DynamicBenchmarker.markdown} function.
|
|
26
|
+
*
|
|
27
|
+
* Additionally, if you hope to see some utilization cases,
|
|
28
|
+
* see the below example tagged links.
|
|
23
29
|
*
|
|
24
30
|
* @example https://github.com/samchon/nestia-start/blob/master/test/benchmaark/index.ts
|
|
25
31
|
* @example https://github.com/samchon/backend/blob/master/test/benchmark/index.ts
|
|
@@ -113,7 +119,13 @@ export declare namespace DynamicBenchmarker {
|
|
|
113
119
|
*/
|
|
114
120
|
parameters: (connection: IConnection, name: string) => Parameters;
|
|
115
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* Benchmark report.
|
|
124
|
+
*/
|
|
116
125
|
interface IReport {
|
|
126
|
+
count: number;
|
|
127
|
+
threads: number;
|
|
128
|
+
simultaneous: number;
|
|
117
129
|
time: number;
|
|
118
130
|
statistics: IReport.IStatistics;
|
|
119
131
|
endpoints: Array<IReport.IEndpoint & IReport.IStatistics>;
|
|
@@ -132,6 +144,32 @@ export declare namespace DynamicBenchmarker {
|
|
|
132
144
|
maximum: number | null;
|
|
133
145
|
}
|
|
134
146
|
}
|
|
147
|
+
/**
|
|
148
|
+
* Master program.
|
|
149
|
+
*
|
|
150
|
+
* Creates a master program that executing the servant programs in parallel.
|
|
151
|
+
*
|
|
152
|
+
* Note that, {@link IMasterProps.servant} property must be the path of
|
|
153
|
+
* the servant program executing the {@link servant} function.
|
|
154
|
+
*
|
|
155
|
+
* @param props Properties of the master program
|
|
156
|
+
* @returns Benchmark report
|
|
157
|
+
*/
|
|
135
158
|
const master: (props: IMasterProps) => Promise<IReport>;
|
|
159
|
+
/**
|
|
160
|
+
* Create a servant program.
|
|
161
|
+
*
|
|
162
|
+
* Creates a servant program executing the prefixed functions in parallel.
|
|
163
|
+
*
|
|
164
|
+
* @param props Properties of the servant program
|
|
165
|
+
* @returns Servant program as a worker server
|
|
166
|
+
*/
|
|
136
167
|
const servant: <Parameters extends any[]>(props: IServantProps<Parameters>) => Promise<WorkerServer<null, IBenchmarkServant, IBenchmarkMaster>>;
|
|
168
|
+
/**
|
|
169
|
+
* Convert the benchmark report to markdown content.
|
|
170
|
+
*
|
|
171
|
+
* @param report Benchmark report
|
|
172
|
+
* @returns Markdown content
|
|
173
|
+
*/
|
|
174
|
+
const markdown: (report: DynamicBenchmarker.IReport) => string;
|
|
137
175
|
}
|
|
@@ -111,6 +111,7 @@ 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"));
|
|
114
115
|
var tgrid_1 = require("tgrid");
|
|
115
116
|
var tstl_1 = require("tstl");
|
|
116
117
|
/**
|
|
@@ -130,7 +131,13 @@ var tstl_1 = require("tstl");
|
|
|
130
131
|
* the path of the servant program to the
|
|
131
132
|
* {@link DynamicBenchmarker.IMasterProps.servant} property.
|
|
132
133
|
*
|
|
133
|
-
*
|
|
134
|
+
* Also, you when you complete the benchmark execution through the
|
|
135
|
+
* {@link DynamicBenchmarker.master} and {@link DynamicBenchmarker.servant}
|
|
136
|
+
* functions, you can convert the result to markdown content by using the
|
|
137
|
+
* {@link DynamicBenchmarker.markdown} function.
|
|
138
|
+
*
|
|
139
|
+
* Additionally, if you hope to see some utilization cases,
|
|
140
|
+
* see the below example tagged links.
|
|
134
141
|
*
|
|
135
142
|
* @example https://github.com/samchon/nestia-start/blob/master/test/benchmaark/index.ts
|
|
136
143
|
* @example https://github.com/samchon/backend/blob/master/test/benchmark/index.ts
|
|
@@ -139,6 +146,17 @@ var tstl_1 = require("tstl");
|
|
|
139
146
|
var DynamicBenchmarker;
|
|
140
147
|
(function (DynamicBenchmarker) {
|
|
141
148
|
var _this = this;
|
|
149
|
+
/**
|
|
150
|
+
* Master program.
|
|
151
|
+
*
|
|
152
|
+
* Creates a master program that executing the servant programs in parallel.
|
|
153
|
+
*
|
|
154
|
+
* Note that, {@link IMasterProps.servant} property must be the path of
|
|
155
|
+
* the servant program executing the {@link servant} function.
|
|
156
|
+
*
|
|
157
|
+
* @param props Properties of the master program
|
|
158
|
+
* @returns Benchmark report
|
|
159
|
+
*/
|
|
142
160
|
DynamicBenchmarker.master = function (props) { return __awaiter(_this, void 0, void 0, function () {
|
|
143
161
|
var completes, servants, started_at, events, time, endpoints, events_1, events_1_1, e;
|
|
144
162
|
var e_1, _a;
|
|
@@ -206,6 +224,9 @@ var DynamicBenchmarker;
|
|
|
206
224
|
finally { if (e_1) throw e_1.error; }
|
|
207
225
|
}
|
|
208
226
|
return [2 /*return*/, {
|
|
227
|
+
count: props.count,
|
|
228
|
+
threads: props.threads,
|
|
229
|
+
simultaneous: props.simultaneous,
|
|
209
230
|
time: time,
|
|
210
231
|
statistics: statistics(events),
|
|
211
232
|
endpoints: __spreadArray([], __read(endpoints), false).map(function (it) { return (__assign(__assign({}, statistics(it.second)), it.first)); }),
|
|
@@ -213,6 +234,14 @@ var DynamicBenchmarker;
|
|
|
213
234
|
}
|
|
214
235
|
});
|
|
215
236
|
}); };
|
|
237
|
+
/**
|
|
238
|
+
* Create a servant program.
|
|
239
|
+
*
|
|
240
|
+
* Creates a servant program executing the prefixed functions in parallel.
|
|
241
|
+
*
|
|
242
|
+
* @param props Properties of the servant program
|
|
243
|
+
* @returns Servant program as a worker server
|
|
244
|
+
*/
|
|
216
245
|
DynamicBenchmarker.servant = function (props) { return __awaiter(_this, void 0, void 0, function () {
|
|
217
246
|
var server;
|
|
218
247
|
return __generator(this, function (_a) {
|
|
@@ -231,6 +260,81 @@ var DynamicBenchmarker;
|
|
|
231
260
|
}
|
|
232
261
|
});
|
|
233
262
|
}); };
|
|
263
|
+
/**
|
|
264
|
+
* Convert the benchmark report to markdown content.
|
|
265
|
+
*
|
|
266
|
+
* @param report Benchmark report
|
|
267
|
+
* @returns Markdown content
|
|
268
|
+
*/
|
|
269
|
+
DynamicBenchmarker.markdown = function (report) {
|
|
270
|
+
var format = function (value) {
|
|
271
|
+
return value === null ? "N/A" : (Math.floor(value * 100) / 100).toLocaleString();
|
|
272
|
+
};
|
|
273
|
+
var writeHead = function () {
|
|
274
|
+
return [
|
|
275
|
+
"Type",
|
|
276
|
+
"Count",
|
|
277
|
+
"Success",
|
|
278
|
+
"Mean.",
|
|
279
|
+
"Stdev.",
|
|
280
|
+
"Minimum",
|
|
281
|
+
"Maximum",
|
|
282
|
+
].join(" | ") +
|
|
283
|
+
"\n" +
|
|
284
|
+
new Array(7).fill("----").join("|");
|
|
285
|
+
};
|
|
286
|
+
var writeRow = function (title, statistics) {
|
|
287
|
+
return [
|
|
288
|
+
title,
|
|
289
|
+
statistics.count.toLocaleString(),
|
|
290
|
+
statistics.success.toLocaleString(),
|
|
291
|
+
format(statistics.mean),
|
|
292
|
+
format(statistics.stdev),
|
|
293
|
+
format(statistics.minimum),
|
|
294
|
+
format(statistics.maximum),
|
|
295
|
+
].join(" | ");
|
|
296
|
+
};
|
|
297
|
+
return __spreadArray(__spreadArray(__spreadArray([
|
|
298
|
+
"## Benchmark Report",
|
|
299
|
+
"> - CPU: ".concat(os_1.default.cpus()[0].model),
|
|
300
|
+
"> - RAM: ".concat(Math.floor(os_1.default.totalmem() / 1024 / 1024 / 1024).toLocaleString(), " GB"),
|
|
301
|
+
"> - NodeJS Version: ".concat(process.version),
|
|
302
|
+
"> - Backend Server: 1 core / 1 thread",
|
|
303
|
+
"> - Arguments: ",
|
|
304
|
+
"> - Count: ".concat(report.count.toLocaleString()),
|
|
305
|
+
"> - Threads: ".concat(report.threads.toLocaleString()),
|
|
306
|
+
"> - Simultaneous: ".concat(report.simultaneous.toLocaleString()),
|
|
307
|
+
"> - Total Elapsed Time: ".concat(report.time.toLocaleString(), " ms"),
|
|
308
|
+
"",
|
|
309
|
+
"### Total",
|
|
310
|
+
writeHead(),
|
|
311
|
+
writeRow("Total", report.statistics),
|
|
312
|
+
"",
|
|
313
|
+
"### Endpoints",
|
|
314
|
+
writeHead()
|
|
315
|
+
], __read(report.endpoints
|
|
316
|
+
.slice()
|
|
317
|
+
.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); })
|
|
318
|
+
.map(function (endpoint) {
|
|
319
|
+
return writeRow("".concat(endpoint.method, " ").concat(endpoint.path), endpoint);
|
|
320
|
+
})), false), [
|
|
321
|
+
"",
|
|
322
|
+
"### Failures",
|
|
323
|
+
"Method | Path | Count | Success",
|
|
324
|
+
"-------|------|-------|--------"
|
|
325
|
+
], false), __read(report.endpoints
|
|
326
|
+
.filter(function (e) { return e.success !== e.count; })
|
|
327
|
+
.slice()
|
|
328
|
+
.sort(function (a, b) { return b.count - a.count; })
|
|
329
|
+
.map(function (e) {
|
|
330
|
+
return [
|
|
331
|
+
e.method,
|
|
332
|
+
e.path,
|
|
333
|
+
e.count.toLocaleString(),
|
|
334
|
+
e.success.toLocaleString(),
|
|
335
|
+
].join(" | ");
|
|
336
|
+
})), false).join("\n");
|
|
337
|
+
};
|
|
234
338
|
var execute = function (ctx) {
|
|
235
339
|
return function (mass) { return __awaiter(_this, void 0, void 0, function () {
|
|
236
340
|
var functions, events;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicBenchmarker.js","sourceRoot":"","sources":["../src/DynamicBenchmarker.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,0CAAoB;AACpB,+BAA8D;AAC9D,6BAAqC;AAMrC
|
|
1
|
+
{"version":3,"file":"DynamicBenchmarker.js","sourceRoot":"","sources":["../src/DynamicBenchmarker.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,0CAAoB;AACpB,0CAAoB;AACpB,+BAA8D;AAC9D,6BAAqC;AAMrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,IAAiB,kBAAkB,CAwYlC;AAxYD,WAAiB,kBAAkB;;IA6HjC;;;;;;;;;;OAUG;IACU,yBAAM,GAAG,UAAO,KAAmB;;;;;;;;oBACxC,SAAS,GAAa,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAKvD,qBAAM,OAAO,CAAC,GAAG,CACrB,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAO,CAAC;;;;;;wCACxC,SAAS,GAIX,IAAI,uBAAe,CACrB,IAAI,EACJ;4CACE,MAAM,EAAE,MAAA,KAAK,CAAC,MAAM,mCAAI,CAAC,cAAM,OAAA,IAAI,EAAJ,CAAI,CAAC;4CACpC,QAAQ,EAAE,UAAC,OAAO;gDAChB,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;gDACvB,IAAI,KAAK,CAAC,QAAQ;oDAChB,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,GAAG,CAAC,EAAL,CAAK,EAAE,CAAC,CAAC,CAAC,CAAC;4CACzD,CAAC;yCACF,EACD,SAAS,CACV,CAAC;wCACF,qBAAM,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,EAAA;;wCAA9D,SAA8D,CAAC;wCAC/D,sBAAO,SAAS,EAAC;;;6BAClB,CAAC,CACH,EAAA;;oBAzBK,QAAQ,GAIR,SAqBL;oBACK,UAAU,GAAS,IAAI,IAAI,EAAE,CAAC;oBAElC,qBAAM,OAAO,CAAC,GAAG,CACf,QAAQ,CAAC,GAAG,CAAC,UAAC,SAAS;4BACrB,OAAA,SAAS,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC;gCAC5B,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;gCAC7C,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC;6BAC5D,CAAC;wBAHF,CAGE,CACH,CACF,EAAA;;oBARG,MAAM,GAAsB,CAChC,SAOC,CACF,CAAC,IAAI,EAAE;oBACF,IAAI,GAAW,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;oBACvD,qBAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAC,SAAS,IAAK,OAAA,SAAS,CAAC,KAAK,EAAE,EAAjB,CAAiB,CAAC,CAAC,EAAA;;oBAAjE,SAAiE,CAAC;oBAClE,IAAI,KAAK,CAAC,QAAQ;wBAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAE1C,SAAS,GACb,IAAI,cAAO,CACT,UAAC,GAAG,IAAK,OAAA,IAAA,WAAI,EAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,EAA1B,CAA0B,EACnC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAA1C,CAA0C,CACrD,CAAC;;wBACJ,KAAgB,WAAA,SAAA,MAAM,CAAA;4BAAX,CAAC;4BACV,SAAS;iCACN,IAAI,CACH;gCACE,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM;gCACzB,IAAI,EAAE,MAAA,CAAC,CAAC,QAAQ,CAAC,QAAQ,mCAAI,CAAC,CAAC,QAAQ,CAAC,IAAI;6BAC7C,EACD,cAAM,OAAA,EAAE,EAAF,CAAE,CACT;iCACA,IAAI,CAAC,CAAC,CAAC,CAAC;yBAAA;;;;;;;;;oBACb,sBAAO;4BACL,KAAK,EAAE,KAAK,CAAC,KAAK;4BAClB,OAAO,EAAE,KAAK,CAAC,OAAO;4BACtB,YAAY,EAAE,KAAK,CAAC,YAAY;4BAChC,IAAI,MAAA;4BACJ,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC;4BAC9B,SAAS,EAAE,yBAAI,SAAS,UAAE,GAAG,CAAC,UAAC,EAAE,IAAK,OAAA,uBACjC,UAAU,CAAC,EAAE,CAAC,MAAM,CAAC,GACrB,EAAE,CAAC,KAAK,EACX,EAHoC,CAGpC,CAAC;yBACJ,EAAC;;;SACH,CAAC;IAEF;;;;;;;OAOG;IACU,0BAAO,GAAG,UACrB,KAAgC;;;;;oBAE1B,MAAM,GACV,IAAI,oBAAY,EAAE,CAAC;oBACrB,qBAAM,MAAM,CAAC,IAAI,CAAC;4BAChB,OAAO,EAAE,OAAO,CAAC;gCACf,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE;gCAC1B,KAAK,OAAA;6BACN,CAAC;yBACH,CAAC,EAAA;;oBALF,SAKE,CAAC;oBACH,sBAAO,MAAM,EAAC;;;SACf,CAAC;IAEF;;;;;OAKG;IACU,2BAAQ,GAAG,UAAC,MAAkC;QACzD,IAAM,MAAM,GAAG,UAAC,KAAoB;YAClC,OAAA,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,cAAc,EAAE;QAAzE,CAAyE,CAAC;QAC5E,IAAM,SAAS,GAAG;YAChB,OAAA;gBACE,MAAM;gBACN,OAAO;gBACP,SAAS;gBACT,OAAO;gBACP,QAAQ;gBACR,SAAS;gBACT,SAAS;aACV,CAAC,IAAI,CAAC,KAAK,CAAC;gBACb,IAAI;gBACJ,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAVnC,CAUmC,CAAC;QACtC,IAAM,QAAQ,GAAG,UACf,KAAa,EACb,UAAkD;YAElD,OAAA;gBACE,KAAK;gBACL,UAAU,CAAC,KAAK,CAAC,cAAc,EAAE;gBACjC,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE;gBACnC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;gBACvB,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;gBACxB,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;gBAC1B,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;aAC3B,CAAC,IAAI,CAAC,KAAK,CAAC;QARb,CAQa,CAAC;QAChB,OAAO;YACL,qBAAqB;YACrB,mBAAY,YAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAE;YAChC,mBAAY,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,cAAc,EAAE,QAAK;YAChF,8BAAuB,OAAO,CAAC,OAAO,CAAE;YACxC,uCAAuC;YACvC,iBAAiB;YACjB,uBAAgB,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAE;YAC/C,yBAAkB,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAE;YACnD,8BAAuB,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,CAAE;YAC7D,kCAA2B,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,QAAK;YAC5D,EAAE;YACF,WAAW;YACX,SAAS,EAAE;YACX,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC;YACpC,EAAE;YACF,eAAe;YACf,SAAS,EAAE;kBACR,MAAM,CAAC,SAAS;aAChB,KAAK,EAAE;aACP,IAAI,CAAC,UAAC,CAAC,EAAE,CAAC,gBAAK,OAAA,CAAC,MAAA,CAAC,CAAC,IAAI,mCAAI,CAAC,CAAC,GAAG,CAAC,MAAA,CAAC,CAAC,IAAI,mCAAI,CAAC,CAAC,CAAA,EAAA,CAAC;aAC7C,GAAG,CAAC,UAAC,QAAQ;YACZ,OAAA,QAAQ,CAAC,UAAG,QAAQ,CAAC,MAAM,cAAI,QAAQ,CAAC,IAAI,CAAE,EAAE,QAAQ,CAAC;QAAzD,CAAyD,CAC1D;YACH,EAAE;YACF,cAAc;YACd,iCAAiC;YACjC,iCAAiC;0BAC9B,MAAM,CAAC,SAAS;aAChB,MAAM,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,KAAK,EAArB,CAAqB,CAAC;aACpC,KAAK,EAAE;aACP,IAAI,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,EAAjB,CAAiB,CAAC;aACjC,GAAG,CAAC,UAAC,CAAC;YACL,OAAA;gBACE,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,KAAK,CAAC,cAAc,EAAE;gBACxB,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE;aAC3B,CAAC,IAAI,CAAC,KAAK,CAAC;QALb,CAKa,CACd,UACH,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC;IAEF,IAAM,OAAO,GACX,UAA2B,GAG1B;QACD,OAAA,UAAO,IAGN;;;;;;wBACO,SAAS,GAA4B,EAAE,CAAC;wBAC9C,qBAAM,OAAO,CAAC;gCACZ,UAAU,EAAE,SAAS;gCACrB,MAAM,EAAE,GAAG,CAAC,MAAM;gCAClB,KAAK,EAAE,GAAG,CAAC,KAAK;6BACjB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAA;;wBAJtB,SAIsB,CAAC;wBACjB,MAAM,GAAsB,EAAE,CAAC;wBAErC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,UAAO,CAAC;;;gCACpC,MAAM,CAAC,IAAI,CAAC;oCACV,QAAQ,EAAE,CAAC,CAAC,KAAK;oCACjB,MAAM,EAAE,CAAC,CAAC,MAAM;oCAChB,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE;oCACtC,SAAS,EAAE,MAAA,MAAA,CAAC,CAAC,UAAU,0CAAE,WAAW,EAAE,mCAAI,IAAI;oCAC9C,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE;iCAC3C,CAAC,CAAC;;;6BACJ,CAAC;wBAEF,qBAAM,OAAO,CAAC,GAAG,CACf,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;;;;;iDACnC,CAAA,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAA;4CACzB,IAAI,GAAW,MAAM,CAAC,MAAM,CAAC;4CAC7B,IAAI,GACR,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;;;;4CAExD,qBAAM,IAAI,CAAC,KAAK,OAAV,IAAI,2BACL,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,YACxD;;4CAFD,SAEC,CAAC;4CACI,OAAO,GAAW,MAAM,CAAC,MAAM,CAAC;4CACtC,IAAI,OAAO,KAAK,IAAI;gDAClB,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,cAAO,CAAC,CAAC,CAAC;;;;;;;;;iCAGpD,CAAC,CACH,EAAA;;wBAhBD,SAgBC,CAAC;wBACF,qBAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAA;;wBAAxC,SAAwC,CAAC;wBACzC,sBAAO,MAAM,EAAC;;;aACf;IAzCD,CAyCC,CAAC;IAEJ,IAAM,UAAU,GAAG,UAAC,MAAyB;QAC3C,IAAM,SAAS,GAAsB,MAAM,CAAC,MAAM,CAChD,UAAC,KAAK,IAAK,OAAA,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAA5C,CAA4C,CACxD,CAAC;QACF,kBACE,KAAK,EAAE,MAAM,CAAC,MAAM,EACpB,OAAO,EAAE,SAAS,CAAC,MAAM,IACtB,OAAO,CAAC,MAAM,CAAC,EAClB;IACJ,CAAC,CAAC;IAEF,IAAM,OAAO,GAAG,UACd,MAAyB;;QAEzB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YACrB,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,IAAI;gBACX,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,IAAI,IAAI,GAAW,CAAC,CAAC;QACrB,IAAI,KAAK,GAAW,CAAC,CAAC;QACtB,IAAI,OAAO,GAAW,MAAM,CAAC,gBAAgB,CAAC;QAC9C,IAAI,OAAO,GAAW,MAAM,CAAC,gBAAgB,CAAC;;YAC9C,KAAoB,IAAA,WAAA,SAAA,MAAM,CAAA,8BAAA,kDAAE,CAAC;gBAAxB,IAAM,OAAK,mBAAA;gBACd,IAAM,OAAO,GACX,IAAI,IAAI,CAAC,OAAK,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;oBACtC,IAAI,IAAI,CAAC,OAAK,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;gBACvC,IAAI,IAAI,OAAO,CAAC;gBAChB,KAAK,IAAI,OAAO,GAAG,OAAO,CAAC;gBAC3B,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACrC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACvC,CAAC;;;;;;;;;QACD,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC;QACtB,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;QACvD,OAAO,EAAE,IAAI,MAAA,EAAE,KAAK,OAAA,EAAE,OAAO,SAAA,EAAE,OAAO,SAAA,EAAE,CAAC;IAC3C,CAAC,CAAC;AACJ,CAAC,EAxYgB,kBAAkB,kCAAlB,kBAAkB,QAwYlC;AAOD,IAAM,OAAO,GACX,UAA2B,GAI1B;IACD,OAAA,UAAO,IAAY;;;;;wBACW,qBAAM,YAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAA;;oBAArD,SAAS,GAAa,SAA+B;;;;oBACxC,cAAA,SAAA,SAAS,CAAA;;;;oBAAjB,IAAI;oBACP,aAAmB,UAAG,IAAI,cAAI,IAAI,CAAE,CAAC;oBACpB,qBAAM,YAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAQ,CAAC,EAAA;;oBAAjD,IAAI,GAAa,SAAgC;yBACnD,CAAA,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAA,EAA3B,wBAA2B;oBAAE,qBAAM,OAAO,CAAC,GAAG,CAAC,CAAC,UAAQ,CAAC,EAAA;;oBAA5B,SAA4B,CAAC;;;yBACrD,CAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,CAAA,EAA7B,yBAA6B;oBACrB,+CAAa,UAAQ,4DAAC;;oBAA/B,MAAM,GAAG,SAAsB;;;;oBACV,oBAAA,SAAA,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA,CAAA;;;;oBAAtC,KAAA,mBAAY,EAAX,GAAG,QAAA,EAAE,KAAK,QAAA;yBAChB,CAAA,OAAO,KAAK,KAAK,UAAU,CAAA,EAA3B,yBAA2B;oBAAE,yBAAS;;yBACjC,CAAA,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,CAAA,EAA1C,yBAA0C;oBAAE,yBAAS;yBACpD,qBAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAA;;oBAAjC,IAAI,CAAC,SAA4B,CAAC,KAAK,KAAK;wBAAE,yBAAS;;;oBAC5D,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;wBAClB,GAAG,KAAA;wBACH,KAAK,EAAE,KAA8C;qBACtD,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAIV;AAnBD,CAmBC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { IConnection } from "@nestia/fetcher";
|
|
2
2
|
import fs from "fs";
|
|
3
|
+
import os from "os";
|
|
3
4
|
import { Driver, WorkerConnector, WorkerServer } from "tgrid";
|
|
4
5
|
import { HashMap, hash } from "tstl";
|
|
5
6
|
|
|
@@ -24,7 +25,13 @@ import { IBenchmarkServant } from "./structures/IBenchmarkServant";
|
|
|
24
25
|
* the path of the servant program to the
|
|
25
26
|
* {@link DynamicBenchmarker.IMasterProps.servant} property.
|
|
26
27
|
*
|
|
27
|
-
*
|
|
28
|
+
* Also, you when you complete the benchmark execution through the
|
|
29
|
+
* {@link DynamicBenchmarker.master} and {@link DynamicBenchmarker.servant}
|
|
30
|
+
* functions, you can convert the result to markdown content by using the
|
|
31
|
+
* {@link DynamicBenchmarker.markdown} function.
|
|
32
|
+
*
|
|
33
|
+
* Additionally, if you hope to see some utilization cases,
|
|
34
|
+
* see the below example tagged links.
|
|
28
35
|
*
|
|
29
36
|
* @example https://github.com/samchon/nestia-start/blob/master/test/benchmaark/index.ts
|
|
30
37
|
* @example https://github.com/samchon/backend/blob/master/test/benchmark/index.ts
|
|
@@ -128,7 +135,14 @@ export namespace DynamicBenchmarker {
|
|
|
128
135
|
*/
|
|
129
136
|
parameters: (connection: IConnection, name: string) => Parameters;
|
|
130
137
|
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Benchmark report.
|
|
141
|
+
*/
|
|
131
142
|
export interface IReport {
|
|
143
|
+
count: number;
|
|
144
|
+
threads: number;
|
|
145
|
+
simultaneous: number;
|
|
132
146
|
time: number;
|
|
133
147
|
statistics: IReport.IStatistics;
|
|
134
148
|
endpoints: Array<IReport.IEndpoint & IReport.IStatistics>;
|
|
@@ -148,6 +162,17 @@ export namespace DynamicBenchmarker {
|
|
|
148
162
|
}
|
|
149
163
|
}
|
|
150
164
|
|
|
165
|
+
/**
|
|
166
|
+
* Master program.
|
|
167
|
+
*
|
|
168
|
+
* Creates a master program that executing the servant programs in parallel.
|
|
169
|
+
*
|
|
170
|
+
* Note that, {@link IMasterProps.servant} property must be the path of
|
|
171
|
+
* the servant program executing the {@link servant} function.
|
|
172
|
+
*
|
|
173
|
+
* @param props Properties of the master program
|
|
174
|
+
* @returns Benchmark report
|
|
175
|
+
*/
|
|
151
176
|
export const master = async (props: IMasterProps): Promise<IReport> => {
|
|
152
177
|
const completes: number[] = new Array(props.threads).fill(0);
|
|
153
178
|
const servants: WorkerConnector<
|
|
@@ -207,6 +232,9 @@ export namespace DynamicBenchmarker {
|
|
|
207
232
|
)
|
|
208
233
|
.push(e);
|
|
209
234
|
return {
|
|
235
|
+
count: props.count,
|
|
236
|
+
threads: props.threads,
|
|
237
|
+
simultaneous: props.simultaneous,
|
|
210
238
|
time,
|
|
211
239
|
statistics: statistics(events),
|
|
212
240
|
endpoints: [...endpoints].map((it) => ({
|
|
@@ -216,6 +244,14 @@ export namespace DynamicBenchmarker {
|
|
|
216
244
|
};
|
|
217
245
|
};
|
|
218
246
|
|
|
247
|
+
/**
|
|
248
|
+
* Create a servant program.
|
|
249
|
+
*
|
|
250
|
+
* Creates a servant program executing the prefixed functions in parallel.
|
|
251
|
+
*
|
|
252
|
+
* @param props Properties of the servant program
|
|
253
|
+
* @returns Servant program as a worker server
|
|
254
|
+
*/
|
|
219
255
|
export const servant = async <Parameters extends any[]>(
|
|
220
256
|
props: IServantProps<Parameters>,
|
|
221
257
|
): Promise<WorkerServer<null, IBenchmarkServant, IBenchmarkMaster>> => {
|
|
@@ -230,6 +266,83 @@ export namespace DynamicBenchmarker {
|
|
|
230
266
|
return server;
|
|
231
267
|
};
|
|
232
268
|
|
|
269
|
+
/**
|
|
270
|
+
* Convert the benchmark report to markdown content.
|
|
271
|
+
*
|
|
272
|
+
* @param report Benchmark report
|
|
273
|
+
* @returns Markdown content
|
|
274
|
+
*/
|
|
275
|
+
export const markdown = (report: DynamicBenchmarker.IReport): string => {
|
|
276
|
+
const format = (value: number | null) =>
|
|
277
|
+
value === null ? "N/A" : (Math.floor(value * 100) / 100).toLocaleString();
|
|
278
|
+
const writeHead = () =>
|
|
279
|
+
[
|
|
280
|
+
"Type",
|
|
281
|
+
"Count",
|
|
282
|
+
"Success",
|
|
283
|
+
"Mean.",
|
|
284
|
+
"Stdev.",
|
|
285
|
+
"Minimum",
|
|
286
|
+
"Maximum",
|
|
287
|
+
].join(" | ") +
|
|
288
|
+
"\n" +
|
|
289
|
+
new Array(7).fill("----").join("|");
|
|
290
|
+
const writeRow = (
|
|
291
|
+
title: string,
|
|
292
|
+
statistics: DynamicBenchmarker.IReport.IStatistics,
|
|
293
|
+
) =>
|
|
294
|
+
[
|
|
295
|
+
title,
|
|
296
|
+
statistics.count.toLocaleString(),
|
|
297
|
+
statistics.success.toLocaleString(),
|
|
298
|
+
format(statistics.mean),
|
|
299
|
+
format(statistics.stdev),
|
|
300
|
+
format(statistics.minimum),
|
|
301
|
+
format(statistics.maximum),
|
|
302
|
+
].join(" | ");
|
|
303
|
+
return [
|
|
304
|
+
`## Benchmark Report`,
|
|
305
|
+
`> - CPU: ${os.cpus()[0].model}`,
|
|
306
|
+
`> - RAM: ${Math.floor(os.totalmem() / 1024 / 1024 / 1024).toLocaleString()} GB`,
|
|
307
|
+
`> - NodeJS Version: ${process.version}`,
|
|
308
|
+
`> - Backend Server: 1 core / 1 thread`,
|
|
309
|
+
`> - Arguments: `,
|
|
310
|
+
`> - Count: ${report.count.toLocaleString()}`,
|
|
311
|
+
`> - Threads: ${report.threads.toLocaleString()}`,
|
|
312
|
+
`> - Simultaneous: ${report.simultaneous.toLocaleString()}`,
|
|
313
|
+
`> - Total Elapsed Time: ${report.time.toLocaleString()} ms`,
|
|
314
|
+
"",
|
|
315
|
+
"### Total",
|
|
316
|
+
writeHead(),
|
|
317
|
+
writeRow("Total", report.statistics),
|
|
318
|
+
"",
|
|
319
|
+
"### Endpoints",
|
|
320
|
+
writeHead(),
|
|
321
|
+
...report.endpoints
|
|
322
|
+
.slice()
|
|
323
|
+
.sort((a, b) => (b.mean ?? 0) - (a.mean ?? 0))
|
|
324
|
+
.map((endpoint) =>
|
|
325
|
+
writeRow(`${endpoint.method} ${endpoint.path}`, endpoint),
|
|
326
|
+
),
|
|
327
|
+
"",
|
|
328
|
+
"### Failures",
|
|
329
|
+
"Method | Path | Count | Success",
|
|
330
|
+
"-------|------|-------|--------",
|
|
331
|
+
...report.endpoints
|
|
332
|
+
.filter((e) => e.success !== e.count)
|
|
333
|
+
.slice()
|
|
334
|
+
.sort((a, b) => b.count - a.count)
|
|
335
|
+
.map((e) =>
|
|
336
|
+
[
|
|
337
|
+
e.method,
|
|
338
|
+
e.path,
|
|
339
|
+
e.count.toLocaleString(),
|
|
340
|
+
e.success.toLocaleString(),
|
|
341
|
+
].join(" | "),
|
|
342
|
+
),
|
|
343
|
+
].join("\n");
|
|
344
|
+
};
|
|
345
|
+
|
|
233
346
|
const execute =
|
|
234
347
|
<Parameters extends any[]>(ctx: {
|
|
235
348
|
driver: Driver<IBenchmarkMaster>;
|