diff options
author | Matt Mastracci <matthew@mastracci.com> | 2023-06-08 09:32:08 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-08 09:32:08 -0600 |
commit | 976c38104569182ba41d9351a108e673f63ffb98 (patch) | |
tree | 9bb0ce756a701febdbfdac18e49891c4d0b58fa8 /ext/websocket/01_websocket.js | |
parent | f35161d3c549c46309ddfbe286ed3f9507076ccd (diff) |
perf(ext/websocket): Reduce GC pressure & monomorpize op_ws_next_event (#19405)
Reduce the GC pressure from the websocket event method by splitting it
into an event getter and a buffer getter.
Before:
165.9k msg/sec
After:
169.9k msg/sec
Diffstat (limited to 'ext/websocket/01_websocket.js')
-rw-r--r-- | ext/websocket/01_websocket.js | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/ext/websocket/01_websocket.js b/ext/websocket/01_websocket.js index f6cb6599d..e6b0053c6 100644 --- a/ext/websocket/01_websocket.js +++ b/ext/websocket/01_websocket.js @@ -53,6 +53,9 @@ const { op_ws_send_binary, op_ws_send_text, op_ws_next_event, + op_ws_get_buffer, + op_ws_get_buffer_as_string, + op_ws_get_error, op_ws_send_ping, op_ws_get_buffered_amount, } = core.ensureFastOps(); @@ -407,15 +410,16 @@ class WebSocket extends EventTarget { } async [_eventLoop]() { + const rid = this[_rid]; while (this[_readyState] !== CLOSED) { - const { 0: kind, 1: value } = await op_ws_next_event(this[_rid]); + const kind = await op_ws_next_event(rid); switch (kind) { case 0: { /* string */ this[_serverHandleIdleTimeout](); const event = new MessageEvent("message", { - data: value, + data: op_ws_get_buffer_as_string(rid), origin: this[_url], }); dispatch(this, event); @@ -424,12 +428,13 @@ class WebSocket extends EventTarget { case 1: { /* binary */ this[_serverHandleIdleTimeout](); + // deno-lint-ignore prefer-primordials + const buffer = op_ws_get_buffer(rid).buffer; let data; - if (this.binaryType === "blob") { - data = new Blob([value]); + data = new Blob([buffer]); } else { - data = value; + data = buffer; } const event = new MessageEvent("message", { @@ -450,13 +455,13 @@ class WebSocket extends EventTarget { this[_readyState] = CLOSED; const errorEv = new ErrorEvent("error", { - message: value, + message: op_ws_get_error(rid), }); this.dispatchEvent(errorEv); const closeEv = new CloseEvent("close"); this.dispatchEvent(closeEv); - core.tryClose(this[_rid]); + core.tryClose(rid); break; } default: { @@ -469,9 +474,9 @@ class WebSocket extends EventTarget { if (prevState === OPEN) { try { await op_ws_close( - this[_rid], + rid, code, - value, + op_ws_get_error(rid), ); } catch { // ignore failures @@ -481,10 +486,10 @@ class WebSocket extends EventTarget { const event = new CloseEvent("close", { wasClean: true, code: code, - reason: value, + reason: op_ws_get_error(rid), }); this.dispatchEvent(event); - core.tryClose(this[_rid]); + core.tryClose(rid); break; } } |