diff options
author | Marc Mutz <marc.mutz@qt.io> | 2022-05-16 11:34:18 +0200 |
---|---|---|
committer | Marc Mutz <marc.mutz@qt.io> | 2022-05-17 18:49:31 +0200 |
commit | 9080a810ad9ca49c7a684beca602b02e9c89500a (patch) | |
tree | 4305a01bb9aa9dac0a41971b41a445a593b0d7d4 | |
parent | 0ca2cf42e0de422634f13fb6a5e5a9d7560b323b (diff) |
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 <fabian.kosmale@qt.io>
-rw-r--r-- | src/corelib/kernel/qproperty.cpp | 18 | ||||
-rw-r--r-- | 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<QPropertyObserver>()); + 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<QPropertyObserver>()); - return {&heapObservers->emplace_back()}; - } + QPropertyObserverPointer allocateDependencyObserver_slow(); QPropertyBindingSourceLocation sourceLocation() const { |