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

Reply via email to