summaryrefslogtreecommitdiff
path: root/core/http_bench.js
diff options
context:
space:
mode:
Diffstat (limited to 'core/http_bench.js')
-rw-r--r--core/http_bench.js136
1 files changed, 65 insertions, 71 deletions
diff --git a/core/http_bench.js b/core/http_bench.js
index aae15a72c..e5598c06f 100644
--- a/core/http_bench.js
+++ b/core/http_bench.js
@@ -6,64 +6,21 @@ const OP_ACCEPT = 2;
const OP_READ = 3;
const OP_WRITE = 4;
const OP_CLOSE = 5;
-const INDEX_START = 0;
-const INDEX_END = 1;
-const NUM_RECORDS = 128;
-const RECORD_SIZE = 4;
-
-const shared32 = new Int32Array(libdeno.shared);
-
-function idx(i, off) {
- return 2 + i * RECORD_SIZE + off;
-}
-
-function recordsPush(promiseId, opId, arg, result) {
- let i = shared32[INDEX_END];
- if (i >= NUM_RECORDS) {
- return false;
- }
- shared32[idx(i, 0)] = promiseId;
- shared32[idx(i, 1)] = opId;
- shared32[idx(i, 2)] = arg;
- shared32[idx(i, 3)] = result;
- shared32[INDEX_END]++;
- return true;
-}
-
-function recordsShift() {
- if (shared32[INDEX_START] == shared32[INDEX_END]) {
- return null;
- }
- const i = shared32[INDEX_START];
- const record = {
- promiseId: shared32[idx(i, 0)],
- opId: shared32[idx(i, 1)],
- arg: shared32[idx(i, 2)],
- result: shared32[idx(i, 3)]
- };
- shared32[INDEX_START]++;
- return record;
-}
-
-function recordsReset() {
- shared32[INDEX_START] = 0;
- shared32[INDEX_END] = 0;
-}
-
-function recordsSize() {
- return shared32[INDEX_END] - shared32[INDEX_START];
-}
-
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))
);
-
const promiseMap = new Map();
let nextPromiseId = 1;
+function assert(cond) {
+ if (!cond) {
+ throw Error("assert");
+ }
+}
+
function createResolvable() {
let methods;
const promise = new Promise((resolve, reject) => {
@@ -72,36 +29,73 @@ function createResolvable() {
return Object.assign(promise, methods);
}
+const scratch32 = new Int32Array(4);
+const scratchBytes = new Uint8Array(
+ scratch32.buffer,
+ scratch32.byteOffset,
+ scratch32.byteLength
+);
+assert(scratchBytes.byteLength === 4 * 4);
+
+// Toggle what method we send with. false = legacy.
+// AFAICT This has no effect on performance.
+const sendWithShared = true;
+
+function send(promiseId, opId, arg, zeroCopy = null) {
+ scratch32[0] = promiseId;
+ scratch32[1] = opId;
+ scratch32[2] = arg;
+ scratch32[3] = -1;
+ if (sendWithShared) {
+ Deno._sharedQueue.push(scratchBytes);
+ libdeno.send(null, zeroCopy);
+ } else {
+ libdeno.send(scratchBytes, zeroCopy);
+ }
+}
+
/** Returns Promise<number> */
-function sendAsync(opId, arg, zeroCopyData) {
+function sendAsync(opId, arg, zeroCopy = null) {
const promiseId = nextPromiseId++;
const p = createResolvable();
- recordsReset();
- recordsPush(promiseId, opId, arg, -1);
promiseMap.set(promiseId, p);
- libdeno.send(null, zeroCopyData);
+ send(promiseId, opId, arg, zeroCopy);
return p;
}
-/** Returns u32 number */
-function sendSync(opId, arg) {
- recordsReset();
- recordsPush(0, opId, arg, -1);
- libdeno.send();
- if (recordsSize() != 1) {
- throw Error("Expected sharedSimple to have size 1");
- }
- let { result } = recordsShift();
- return result;
+function recordFromBuf(buf) {
+ assert(buf.byteLength === 16);
+ const buf32 = new Int32Array(buf.buffer, buf.byteOffset, buf.byteLength / 4);
+ return {
+ promiseId: buf32[0],
+ opId: buf32[1],
+ arg: buf32[2],
+ result: buf32[3]
+ };
}
-function handleAsyncMsgFromRust() {
- while (recordsSize() > 0) {
- const { promiseId, result } = recordsShift();
- const p = promiseMap.get(promiseId);
- promiseMap.delete(promiseId);
- p.resolve(result);
+function recv() {
+ const buf = Deno._sharedQueue.shift();
+ if (!buf) {
+ return null;
}
+ return recordFromBuf(buf);
+}
+
+/** Returns i32 number */
+function sendSync(opId, arg) {
+ send(0, opId, arg);
+ const record = recv();
+ assert(recv() == null);
+ return record.result;
+}
+
+function handleAsyncMsgFromRust(buf) {
+ const record = recordFromBuf(buf);
+ const { promiseId, result } = record;
+ const p = promiseMap.get(promiseId);
+ promiseMap.delete(promiseId);
+ p.resolve(result);
}
/** Listens on 0.0.0.0:4500, returns rid. */
@@ -147,12 +141,12 @@ async function serve(rid) {
}
async function main() {
- libdeno.recv(handleAsyncMsgFromRust);
+ Deno._setAsyncHandler(handleAsyncMsgFromRust);
libdeno.print("http_bench.js start\n");
const listenerRid = listen();
- libdeno.print(`listening http://127.0.0.1:4544/ rid = ${listenerRid}`);
+ libdeno.print(`listening http://127.0.0.1:4544/ rid = ${listenerRid}\n`);
while (true) {
const rid = await accept(listenerRid);
// libdeno.print(`accepted ${rid}`);