diff options
| author | Matt Mastracci <matthew@mastracci.com> | 2024-02-10 13:22:13 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-10 20:22:13 +0000 |
| commit | f5e46c9bf2f50d66a953fa133161fc829cecff06 (patch) | |
| tree | 8faf2f5831c1c7b11d842cd9908d141082c869a5 /tests/testdata/workers/bench_round_robin.ts | |
| parent | d2477f780630a812bfd65e3987b70c0d309385bb (diff) | |
chore: move cli/tests/ -> tests/ (#22369)
This looks like a massive PR, but it's only a move from cli/tests ->
tests, and updates of relative paths for files.
This is the first step towards aggregate all of the integration test
files under tests/, which will lead to a set of integration tests that
can run without the CLI binary being built.
While we could leave these tests under `cli`, it would require us to
keep a more complex directory structure for the various test runners. In
addition, we have a lot of complexity to ignore various test files in
the `cli` project itself (cargo publish exclusion rules, autotests =
false, etc).
And finally, the `tests/` folder will eventually house the `test_ffi`,
`test_napi` and other testing code, reducing the size of the root repo
directory.
For easier review, the extremely large and noisy "move" is in the first
commit (with no changes -- just a move), while the remainder of the
changes to actual files is in the second commit.
Diffstat (limited to 'tests/testdata/workers/bench_round_robin.ts')
| -rw-r--r-- | tests/testdata/workers/bench_round_robin.ts | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/tests/testdata/workers/bench_round_robin.ts b/tests/testdata/workers/bench_round_robin.ts new file mode 100644 index 000000000..0380d7979 --- /dev/null +++ b/tests/testdata/workers/bench_round_robin.ts @@ -0,0 +1,65 @@ +// Benchmark measures time it takes to send a message to a group of workers one +// at a time and wait for a response from all of them. Just a general +// throughput and consistency benchmark. +const data = "HTTP/1.1 200 OK\r\nContent-Length: 12\r\n\r\nHello World\n"; +const workerCount = 4; +const cmdsPerWorker = 400; + +function handleAsyncMsgFromWorker( + promiseTable: Map<number, ReturnType<typeof Promise.withResolvers<string>>>, + msg: { cmdId: number; data: string }, +) { + const promise = promiseTable.get(msg.cmdId); + if (promise === null) { + throw new Error(`Failed to find promise: cmdId: ${msg.cmdId}, msg: ${msg}`); + } + promise?.resolve(data); +} + +async function main() { + const workers: Array< + [Map<number, ReturnType<typeof Promise.withResolvers<string>>>, Worker] + > = []; + for (let i = 1; i <= workerCount; ++i) { + const worker = new Worker( + import.meta.resolve("./bench_worker.ts"), + { type: "module" }, + ); + const { promise, resolve } = Promise.withResolvers<void>(); + worker.onmessage = (e) => { + if (e.data.cmdId === 0) resolve(); + }; + worker.postMessage({ cmdId: 0, action: 2 }); + await promise; + workers.push([new Map(), worker]); + } + // assign callback function + for (const [promiseTable, worker] of workers) { + worker.onmessage = (e) => { + handleAsyncMsgFromWorker(promiseTable, e.data); + }; + } + for (const cmdId of Array(cmdsPerWorker).keys()) { + const promises: Array<Promise<string>> = []; + for (const [promiseTable, worker] of workers) { + const deferred = Promise.withResolvers<string>(); + promiseTable.set(cmdId, deferred); + worker.postMessage({ cmdId: cmdId, action: 1, data }); + promises.push(deferred.promise); + } + for (const promise of promises) { + await promise; + } + } + for (const [, worker] of workers) { + const { promise, resolve } = Promise.withResolvers<void>(); + worker.onmessage = (e) => { + if (e.data.cmdId === 3) resolve(); + }; + worker.postMessage({ action: 3 }); + await promise; + } + console.log("Finished!"); +} + +main(); |
