From d856bfd336137e1bcf81a0db9e8ad2b418ba711e Mon Sep 17 00:00:00 2001 From: Divy Srivastava Date: Mon, 1 May 2023 10:39:30 +0530 Subject: perf(ext/web): fast path for ws events (#18905) - Do not use `ReflectHas` in `isNode`. - Avoid copying handler array when handlers.length == 1 - Avoid searching for path target when path.length == 1 ``` Linux divy-2 5.19.0-1022-gcp #24~22.04.1-Ubuntu SMP Sun Apr 23 09:51:08 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux 32GiB System memory Intel(R) Xeon(R) CPU @ 3.10GHz # main + https://github.com/denoland/deno/pull/18904 Msg/sec: 89326.750000 Msg/sec: 90320.000000 Msg/sec: 89576.250000 # this patch Msg/sec: 97250.000000 Msg/sec: 97125.500000 Msg/sec: 97964.500000 ``` --- ext/web/02_event.js | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) (limited to 'ext/web') diff --git a/ext/web/02_event.js b/ext/web/02_event.js index 6a5db3464..0372293cf 100644 --- a/ext/web/02_event.js +++ b/ext/web/02_event.js @@ -482,7 +482,7 @@ function getRoot(eventTarget) { function isNode( eventTarget, ) { - return Boolean(eventTarget && ReflectHas(eventTarget, "nodeType")); + return eventTarget?.nodeType !== undefined; } // https://dom.spec.whatwg.org/#concept-shadow-including-inclusive-ancestor @@ -734,8 +734,12 @@ function innerInvokeEventListeners( return found; } + let handlers = targetListeners[type]; + // Copy event listeners before iterating since the list can be modified during the iteration. - const handlers = ArrayPrototypeSlice(targetListeners[type]); + if (handlers.length > 1) { + handlers = ArrayPrototypeSlice(targetListeners[type]); + } for (let i = 0; i < handlers.length; i++) { const listener = handlers[i]; @@ -804,12 +808,19 @@ function innerInvokeEventListeners( * Ref: https://dom.spec.whatwg.org/#concept-event-listener-invoke */ function invokeEventListeners(tuple, eventImpl) { const path = getPath(eventImpl); - const tupleIndex = ArrayPrototypeIndexOf(path, tuple); - for (let i = tupleIndex; i >= 0; i--) { - const t = path[i]; + if (path.length === 1) { + const t = path[0]; if (t.target) { setTarget(eventImpl, t.target); - break; + } + } else { + const tupleIndex = ArrayPrototypeIndexOf(path, tuple); + for (let i = tupleIndex; i >= 0; i--) { + const t = path[i]; + if (t.target) { + setTarget(eventImpl, t.target); + break; + } } } -- cgit v1.2.3