QProperty: micro optimizations

- Ensure that the allocateDependencyObserver fast path is inlined.
- Use addObserver instead of observerProperty; we know that a freshly
  allocated observer does not have its prev pointer set. If prev weren't
  a private member, we could simply use Q_ASSUME(ptr->prev == nullptr),
  but making it public or befriending the class seems like a bad idea,
  as it grants too much access to the internals.

Pick-to: 6.2
Change-Id: Ia845f2807c70512563f7b9e1ecb85fe82b66208c
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
bb10
Fabian Kosmale 2021-06-25 21:08:35 +02:00
parent b8e1782b67
commit 5d0095b1c2
2 changed files with 8 additions and 3 deletions

View File

@ -540,7 +540,7 @@ void QPropertyBindingData::registerWithCurrentlyEvaluatingBinding_helper(Binding
QPropertyObserverPointer dependencyObserver = currentState->binding->allocateDependencyObserver();
dependencyObserver.setBindingToNotify(currentState->binding);
dependencyObserver.observeProperty(d);
d.addObserver(dependencyObserver.ptr);
}
void QPropertyBindingData::notifyObservers(QUntypedPropertyData *propertyDataPtr) const

View File

@ -293,12 +293,17 @@ public:
heapObservers->clear();
dependencyObserverCount = 0;
}
QPropertyObserverPointer allocateDependencyObserver()
{
Q_ALWAYS_INLINE QPropertyObserverPointer allocateDependencyObserver() {
if (dependencyObserverCount < inlineDependencyObservers.size()) {
++dependencyObserverCount;
return {&inlineDependencyObservers[dependencyObserverCount - 1]};
}
return allocateDependencyObserver_slow();
}
Q_NEVER_INLINE QPropertyObserverPointer allocateDependencyObserver_slow()
{
++dependencyObserverCount;
if (!heapObservers)
heapObservers.reset(new std::vector<QPropertyObserver>());