summaryrefslogtreecommitdiff
path: root/core/examples/http_bench_json_ops.js
diff options
context:
space:
mode:
authorBert Belder <bertbelder@gmail.com>2020-08-21 17:14:47 +0200
committerBert Belder <bertbelder@gmail.com>2020-08-21 20:21:32 +0200
commit29e3f4cd3a42415d73b371f87a6efc787331de86 (patch)
tree78e4b62f8504889d1d4605d0acdb0ad1ff5908f8 /core/examples/http_bench_json_ops.js
parent999e5cf3d44ba41d988f0f3b4f94439a3b794bdc (diff)
Split core http benchmark into 'bin_ops' and 'json_ops' variants (#7147)
Diffstat (limited to 'core/examples/http_bench_json_ops.js')
-rw-r--r--core/examples/http_bench_json_ops.js73
1 files changed, 73 insertions, 0 deletions
diff --git a/core/examples/http_bench_json_ops.js b/core/examples/http_bench_json_ops.js
new file mode 100644
index 000000000..865b04d7e
--- /dev/null
+++ b/core/examples/http_bench_json_ops.js
@@ -0,0 +1,73 @@
+// This is not a real HTTP server. We read blindly one time into 'requestBuf',
+// then write this fixed 'responseBuf'. The point of this benchmark is to
+// exercise the event loop in a simple yet semi-realistic way.
+const requestBuf = new Uint8Array(64 * 1024);
+const responseBuf = new Uint8Array(
+ "HTTP/1.1 200 OK\r\nContent-Length: 12\r\n\r\nHello World\n"
+ .split("")
+ .map((c) => c.charCodeAt(0)),
+);
+
+/** Listens on 0.0.0.0:4500, returns rid. */
+function listen() {
+ const { rid } = Deno.core.jsonOpSync("listen", {});
+ return rid;
+}
+
+/** Accepts a connection, returns rid. */
+async function accept(serverRid) {
+ const { rid } = await Deno.core.jsonOpAsync("accept", { rid: serverRid });
+ return rid;
+}
+
+/**
+ * Reads a packet from the rid, presumably an http request. data is ignored.
+ * Returns bytes read.
+ */
+async function read(rid, data) {
+ const { nread } = await Deno.core.jsonOpAsync("read", { rid }, data);
+ return nread;
+}
+
+/** Writes a fixed HTTP response to the socket rid. Returns bytes written. */
+async function write(rid, data) {
+ const { nwritten } = await Deno.core.jsonOpAsync("write", { rid }, data);
+ return nwritten;
+}
+
+function close(rid) {
+ Deno.core.jsonOpSync("close", { rid });
+}
+
+async function serve(rid) {
+ while (true) {
+ const nread = await read(rid, requestBuf);
+ if (nread <= 0) {
+ break;
+ }
+
+ const nwritten = await write(rid, responseBuf);
+ if (nwritten < 0) {
+ break;
+ }
+ }
+ close(rid);
+}
+
+async function main() {
+ Deno.core.ops();
+
+ const listenerRid = listen();
+ Deno.core.print(`http_bench_json_ops listening on http://127.0.0.1:4544/\n`);
+
+ for (;;) {
+ const rid = await accept(listenerRid);
+ if (rid < 0) {
+ Deno.core.print(`accept error ${rid}`);
+ return;
+ }
+ serve(rid);
+ }
+}
+
+main();