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>
bb10
Marc Mutz 2022-05-16 11:34:18 +02:00
parent 0ca2cf42e0
commit 9080a810ad
2 changed files with 20 additions and 16 deletions

View File

@ -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();

View File

@ -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
{