Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 2ff26dc8e6cceebece3f831bf8670ea9b45fce29
https://github.com/WebKit/WebKit/commit/2ff26dc8e6cceebece3f831bf8670ea9b45fce29
Author: Yusuke Suzuki <[email protected]>
Date: 2025-10-13 (Mon, 13 Oct 2025)
Changed paths:
M Source/JavaScriptCore/API/JSAPIGlobalObject.cpp
M Source/JavaScriptCore/API/JSAPIGlobalObject.mm
M Source/JavaScriptCore/jsc.cpp
M Source/JavaScriptCore/runtime/JSGlobalObject.cpp
M Source/JavaScriptCore/runtime/JSGlobalObject.h
M Source/JavaScriptCore/runtime/Microtask.h
M Source/JavaScriptCore/runtime/MicrotaskQueue.cpp
M Source/JavaScriptCore/runtime/MicrotaskQueue.h
M Source/JavaScriptCore/runtime/MicrotaskQueueInlines.h
M Source/JavaScriptCore/runtime/VM.cpp
M Source/WTF/wtf/CompactRefPtrTuple.h
M Source/WebCore/bindings/js/JSDOMWindowBase.cpp
M Source/WebCore/bindings/js/JSExecState.cpp
M Source/WebCore/bindings/js/JSExecState.h
M Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp
M Source/WebCore/bindings/js/JSWorkletGlobalScopeBase.cpp
M Source/WebCore/dom/EventLoop.cpp
M Source/WebCore/dom/EventLoop.h
M Source/WebCore/dom/Microtasks.cpp
M Source/WebCore/dom/Microtasks.h
Log Message:
-----------
[JSC] Reduce sizeof(QueuedTask) because of extreme allocation via
MicrotaskQueue
https://bugs.webkit.org/show_bug.cgi?id=300565
rdar://162448703
Reviewed by Yijia Huang.
>From profiling information, we found that Deque<QueuedTask> allocation
in MicrotaskQueue is extremely hot. We need to make sure that
sizeof(QueuedTask) is much smaller. This patch aims at cleaning
up these code to gain performance improvement for major benchmarks.
1. We use CompactRefPtrTuple for MicrotaskDispatcher and
InternalMicrotask type in QueuedTask to reduce size.
2. We remove MicrotaskIdentifier generation since it turned out this is
extremely hot from the profiler data. We go back to the previous
method using an allocation pointer for ID. We detect debugger
existence and we create DebuggableMicrotaskDispatcher when there is a
debugger. And we use a pointer of this dispatcher as an ID. This is
the previous way before we moved to MicrotaskIdentifier. So going
back to this because of performance issue.
3. We wrap microtask invocation code with special dispatcher,
JSDebuggableMicrotaskDispatcher, and use it only when debugger is
enabled. So we keep the major non-debugger-enabled path succinct and
extremely fast as we found these debugger() access is very hot from
the profiler data.
4. We define default implementation of JSGlobalObject::queueMicrotaskToEventLoop
and stop checking nullptr for this function registration.
* Source/JavaScriptCore/API/JSAPIGlobalObject.cpp:
(JSC::JSAPIGlobalObject::globalObjectMethodTable):
* Source/JavaScriptCore/API/JSAPIGlobalObject.mm:
(JSC::JSAPIGlobalObject::globalObjectMethodTable):
* Source/JavaScriptCore/jsc.cpp:
* Source/JavaScriptCore/runtime/JSGlobalObject.cpp:
(JSC::JSGlobalObject::baseGlobalObjectMethodTable):
(JSC::JSGlobalObject::queueMicrotaskToEventLoop):
(JSC::JSGlobalObject::queueMicrotask):
* Source/JavaScriptCore/runtime/JSGlobalObject.h:
* Source/JavaScriptCore/runtime/Microtask.h:
* Source/JavaScriptCore/runtime/MicrotaskQueue.cpp:
(JSC::QueuedTask::isRunnable const):
(JSC::DebuggableMicrotaskDispatcher::run):
(JSC::DebuggableMicrotaskDispatcher::isRunnable const):
(JSC::MicrotaskQueue::enqueue):
* Source/JavaScriptCore/runtime/MicrotaskQueue.h:
(JSC::MicrotaskDispatcher::MicrotaskDispatcher):
(JSC::MicrotaskDispatcher::type const):
(JSC::MicrotaskDispatcher::isWebCoreMicrotaskDispatcher const):
(JSC::QueuedTask::QueuedTask):
(JSC::QueuedTask::setDispatcher):
(JSC::QueuedTask::dispatcher const):
(JSC::QueuedTask::identifier const):
(JSC::QueuedTask::job const):
* Source/JavaScriptCore/runtime/MicrotaskQueueInlines.h:
(JSC::MicrotaskQueue::performMicrotaskCheckpoint):
* Source/JavaScriptCore/runtime/VM.cpp:
(JSC::VM::drainMicrotasks):
* Source/WTF/wtf/CompactRefPtrTuple.h:
* Source/WebCore/bindings/js/JSDOMWindowBase.cpp:
(WebCore::JSDOMWindowBase::queueMicrotaskToEventLoop):
* Source/WebCore/bindings/js/JSExecState.cpp:
(WebCore::JSExecState::runTask):
(WebCore::JSExecState::runTaskWithDebugger):
* Source/WebCore/bindings/js/JSExecState.h:
* Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp:
(WebCore::JSWorkerGlobalScopeBase::queueMicrotaskToEventLoop):
* Source/WebCore/bindings/js/JSWorkletGlobalScopeBase.cpp:
(WebCore::JSWorkletGlobalScopeBase::globalObjectMethodTable):
(WebCore::JSWorkletGlobalScopeBase::queueMicrotaskToEventLoop):
* Source/WebCore/dom/EventLoop.cpp:
(WebCore::EventLoopTaskGroup::jsMicrotaskDispatcher):
* Source/WebCore/dom/EventLoop.h:
* Source/WebCore/dom/Microtasks.cpp:
(WebCore::MicrotaskQueue::runJSMicrotaskWithDebugger):
(WebCore::MicrotaskQueue::runJSMicrotask):
(WebCore::MicrotaskQueue::performMicrotaskCheckpoint):
* Source/WebCore/dom/Microtasks.h:
Canonical link: https://commits.webkit.org/301418@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes