diff options
author | Divy Srivastava <dj.srivastava23@gmail.com> | 2023-05-01 10:39:30 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-01 10:39:30 +0530 |
commit | d856bfd336137e1bcf81a0db9e8ad2b418ba711e (patch) | |
tree | 884613ab644135f930757d115675169a567564f0 | |
parent | 9a9473533e70987e922ddd5ff8da915815e37d03 (diff) |
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
```
-rw-r--r-- | cli/tests/testdata/run/event_listener_error_immediate_exit.ts.out | 4 | ||||
-rw-r--r-- | cli/tests/testdata/run/event_listener_error_immediate_exit_worker.ts.out | 6 | ||||
-rw-r--r-- | ext/web/02_event.js | 23 |
3 files changed, 18 insertions, 15 deletions
diff --git a/cli/tests/testdata/run/event_listener_error_immediate_exit.ts.out b/cli/tests/testdata/run/event_listener_error_immediate_exit.ts.out index 2b1b26444..8f03f71b8 100644 --- a/cli/tests/testdata/run/event_listener_error_immediate_exit.ts.out +++ b/cli/tests/testdata/run/event_listener_error_immediate_exit.ts.out @@ -3,8 +3,4 @@ error: Uncaught Error: bar throw new Error("bar"); ^ at [WILDCARD]/event_listener_error_immediate_exit.ts:4:9[WILDCARD] - at innerInvokeEventListeners (ext:deno_web/02_event.js:785:7) - at invokeEventListeners (ext:deno_web/02_event.js:825:5) - at dispatch (ext:deno_web/02_event.js:694:9) - at dispatchEvent (ext:deno_web/02_event.js:1086:12) at [WILDCARD]/event_listener_error_immediate_exit.ts:11:1 diff --git a/cli/tests/testdata/run/event_listener_error_immediate_exit_worker.ts.out b/cli/tests/testdata/run/event_listener_error_immediate_exit_worker.ts.out index 8ab76d6cf..85b52190b 100644 --- a/cli/tests/testdata/run/event_listener_error_immediate_exit_worker.ts.out +++ b/cli/tests/testdata/run/event_listener_error_immediate_exit_worker.ts.out @@ -2,11 +2,7 @@ error: Uncaught (in worker "") Error: bar throw new Error("bar"); ^ - at [WILDCARD]/event_listener_error_immediate_exit.ts:4:9 - at innerInvokeEventListeners (ext:deno_web/02_event.js:785:7) - at invokeEventListeners (ext:deno_web/02_event.js:825:5) - at dispatch (ext:deno_web/02_event.js:694:9) - at dispatchEvent (ext:deno_web/02_event.js:1086:12) + at [WILDCARD]/event_listener_error_immediate_exit.ts:4:9[WILDCARD] at [WILDCARD]/event_listener_error_immediate_exit.ts:11:1 error: Uncaught (in promise) Error: Unhandled error in child worker. at [WILDCARD] 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; + } } } |