From 9080a810ad9ca49c7a684beca602b02e9c89500a Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Mon, 16 May 2022 11:34:18 +0200 Subject: [PATCH] QPropertyBindingPrivate: de-inline functions that modify heapObservers Manipulating owning containers is costly at runtime, but also at compile-time, so don't do it in inline functions, do it out-of-line. Removes the top-2 entries[1] in a Clang -ftime-trace QtWidget build. [1] at the time of writing of this patch Change-Id: I5da5030788b0d976a0ab7875f87ba3b51dbb1231 Reviewed-by: Fabian Kosmale --- src/corelib/kernel/qproperty.cpp | 18 ++++++++++++++++++ src/corelib/kernel/qproperty_p.h | 18 ++---------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/corelib/kernel/qproperty.cpp b/src/corelib/kernel/qproperty.cpp index 2af8657758..55e30c3069 100644 --- a/src/corelib/kernel/qproperty.cpp +++ b/src/corelib/kernel/qproperty.cpp @@ -245,6 +245,24 @@ QPropertyBindingPrivate::~QPropertyBindingPrivate() + QPropertyBindingPrivate::getSizeEnsuringAlignment()); } +void QPropertyBindingPrivate::clearDependencyObservers() { + for (size_t i = 0; i < qMin(dependencyObserverCount, inlineDependencyObservers.size()); ++i) { + QPropertyObserverPointer p{&inlineDependencyObservers[i]}; + p.unlink_fast(); + } + if (heapObservers) + heapObservers->clear(); + dependencyObserverCount = 0; +} + +QPropertyObserverPointer QPropertyBindingPrivate::allocateDependencyObserver_slow() +{ + ++dependencyObserverCount; + if (!heapObservers) + heapObservers.reset(new std::vector()); + return {&heapObservers->emplace_back()}; +} + void QPropertyBindingPrivate::unlinkAndDeref() { clearDependencyObservers(); diff --git a/src/corelib/kernel/qproperty_p.h b/src/corelib/kernel/qproperty_p.h index 9380cc3e6d..00e811f4c3 100644 --- a/src/corelib/kernel/qproperty_p.h +++ b/src/corelib/kernel/qproperty_p.h @@ -295,15 +295,7 @@ public: return observers; } - void clearDependencyObservers() { - for (size_t i = 0; i < qMin(dependencyObserverCount, inlineDependencyObservers.size()); ++i) { - QPropertyObserverPointer p{&inlineDependencyObservers[i]}; - p.unlink_fast(); - } - if (heapObservers) - heapObservers->clear(); - dependencyObserverCount = 0; - } + void clearDependencyObservers(); Q_ALWAYS_INLINE QPropertyObserverPointer allocateDependencyObserver() { if (dependencyObserverCount < inlineDependencyObservers.size()) { @@ -313,13 +305,7 @@ public: return allocateDependencyObserver_slow(); } - Q_NEVER_INLINE QPropertyObserverPointer allocateDependencyObserver_slow() - { - ++dependencyObserverCount; - if (!heapObservers) - heapObservers.reset(new std::vector()); - return {&heapObservers->emplace_back()}; - } + QPropertyObserverPointer allocateDependencyObserver_slow(); QPropertyBindingSourceLocation sourceLocation() const {