From f1823da6d7a2ef67d7856e618d1a3bfc9ec69669 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 13 Oct 2023 14:57:37 +0200 Subject: [PATCH] Performance: Cache the uiCapability to costly dynamic_cast --- .../cafPdmCore/cafPdmObjectHandle.cpp | 8 +++++--- .../cafPdmCore/cafPdmObjectHandle.h | 2 ++ .../cafPdmUiCore/cafPdmUiObjectHandle.cpp | 17 +++++++++++------ 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmObjectHandle.cpp b/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmObjectHandle.cpp index b94061b00a..b7faa527dd 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmObjectHandle.cpp +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmObjectHandle.cpp @@ -13,8 +13,9 @@ namespace caf //-------------------------------------------------------------------------------------------------- PdmObjectHandle::PdmObjectHandle() { - m_parentField = nullptr; - m_isDeletable = false; + m_parentField = nullptr; + m_isDeletable = false; + m_uiCapability = nullptr; m_isInsideInitAfterRead = false; } @@ -146,7 +147,8 @@ void PdmObjectHandle::removeReferencingPtrField( PdmFieldHandle* fieldReferringT //-------------------------------------------------------------------------------------------------- void PdmObjectHandle::prepareForDelete() { - m_parentField = nullptr; + m_parentField = nullptr; + m_uiCapability = nullptr; for ( size_t i = 0; i < m_capabilities.size(); ++i ) { diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmObjectHandle.h b/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmObjectHandle.h index b485737276..5ab98c79a1 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmObjectHandle.h +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmObjectHandle.h @@ -164,6 +164,8 @@ private: // Use friend class to avoid public noise friend class PdmXmlObjectHandle; bool m_isInsideInitAfterRead; + + mutable PdmUiObjectHandle* m_uiCapability; }; } // namespace caf diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiObjectHandle.cpp b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiObjectHandle.cpp index 4152b7f35c..d7744ddf2c 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiObjectHandle.cpp +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiObjectHandle.cpp @@ -24,9 +24,8 @@ PdmUiObjectHandle::PdmUiObjectHandle( PdmObjectHandle* owner, bool giveOwnership PdmUiObjectHandle* uiObj( const PdmObjectHandle* obj ) { if ( !obj ) return nullptr; - PdmUiObjectHandle* uiObject = obj->capability(); - CAF_ASSERT( uiObject ); - return uiObject; + + return obj->uiCapability(); } //-------------------------------------------------------------------------------------------------- @@ -232,10 +231,16 @@ void PdmUiObjectHandle::updateUiIconFromToggleField() //-------------------------------------------------------------------------------------------------- PdmUiObjectHandle* PdmObjectHandle::uiCapability() const { - PdmUiObjectHandle* uiField = capability(); - CAF_ASSERT( uiField ); + if ( !m_uiCapability ) + { + // Cache the ui capability for performance reasons + auto uiField = capability(); + CAF_ASSERT( uiField ); - return uiField; + m_uiCapability = uiField; + } + + return m_uiCapability; } } // End namespace caf