Measure what this library sustains, and against Jasmin and SMPPSim
Test / lint (pull_request) Successful in 21s
Test / test (18) (pull_request) Successful in 30s
Test / test (20) (pull_request) Successful in 31s
Test / test (22) (pull_request) Successful in 36s
Test / test (24) (pull_request) Successful in 30s
Test / test (26) (pull_request) Successful in 30s
Mirror / push (push) Successful in 5s
Test / lint (pull_request) Successful in 21s
Test / test (18) (pull_request) Successful in 30s
Test / test (20) (pull_request) Successful in 31s
Test / test (22) (pull_request) Successful in 36s
Test / test (24) (pull_request) Successful in 30s
Test / test (26) (pull_request) Successful in 30s
Mirror / push (push) Successful in 5s
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
import { spawn } from 'node:child_process';
|
||||
import { once } from 'node:events';
|
||||
import { createInterface } from 'node:readline';
|
||||
|
||||
/**
|
||||
* Node rather than Python, unlike the repo's other standalone scripts: it spawns the two processes
|
||||
* it measures, and they must run on the same runtime this library is measured under.
|
||||
*/
|
||||
const concurrencies = [1, 10, 50, 200];
|
||||
const count = Number(process.env.COUNT ?? 5000);
|
||||
|
||||
function node(script: string, args: string[] = []) {
|
||||
return spawn(process.execPath, [`${import.meta.dirname}/${script}`, ...args], {
|
||||
stdio: ['ignore', 'pipe', 'inherit'],
|
||||
});
|
||||
}
|
||||
|
||||
async function firstLine(stream: NodeJS.ReadableStream): Promise<string> {
|
||||
for await (const line of createInterface({ input: stream })) {
|
||||
return line;
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
const sink = node('smsc-sink.ts');
|
||||
const listening: unknown = JSON.parse(await firstLine(sink.stdout));
|
||||
|
||||
if (typeof listening !== 'object' || listening === null || !('port' in listening)) {
|
||||
throw new Error('the sink did not report a port');
|
||||
}
|
||||
|
||||
const port = String(listening.port);
|
||||
const rows: Record<string, unknown>[] = [];
|
||||
|
||||
for (const dlr of [false, true]) {
|
||||
for (const concurrency of concurrencies) {
|
||||
const load = node('submit-load.ts', [
|
||||
`--port=${port}`,
|
||||
`--count=${String(count)}`,
|
||||
`--concurrency=${String(concurrency)}`,
|
||||
...(dlr ? ['--dlr'] : []),
|
||||
]);
|
||||
const reported: unknown = JSON.parse(await firstLine(load.stdout));
|
||||
|
||||
await once(load, 'exit');
|
||||
|
||||
if (typeof reported === 'object' && reported !== null) rows.push({ ...reported });
|
||||
}
|
||||
}
|
||||
|
||||
sink.kill('SIGTERM');
|
||||
await once(sink, 'exit');
|
||||
|
||||
process.stdout.write(`\n${'dlr'.padEnd(6)}${'window'.padEnd(9)}${'msgs/s'.padEnd(10)}seconds\n`);
|
||||
|
||||
for (const row of rows) {
|
||||
const dlr = String(row.dlr).padEnd(6);
|
||||
const window = String(row.concurrency).padEnd(9);
|
||||
const rate = String(row.perSecond).padEnd(10);
|
||||
|
||||
process.stdout.write(`${dlr}${window}${rate}${String(row.seconds)}\n`);
|
||||
}
|
||||
Reference in New Issue
Block a user