sw/source/writerfilter/dmapper/PropertyMap.cxx | 43 ++++++++++++++++++------- 1 file changed, 32 insertions(+), 11 deletions(-)
New commits: commit cf22d66c5837f108296b37bc98f17ee96869a7ef Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Tue Aug 6 08:30:22 2024 +0200 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Tue Aug 6 09:56:06 2024 +0200 Related: tdf#162295 DOCX import: optimize copying headers/footers The original DOCX bugdoc has 150 sections on 88 pages, which means that copyHeaderFooter() in the domain mapper is a significant cost. Setting a property on a page style involves making a copy of the SwPageDesc, working on that copy and then copying it back. Which means that setting UNO properties one by one vs working via setPropertyValues() is a big difference. - old cost: 11984 ms - new cost: 7764 ms (65% of baseline) Change-Id: Iea99fb3ad9d3e61494c9f012c4c7fa10cc7ab09d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171519 Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> Tested-by: Jenkins Reviewed-by: Miklos Vajna <vmik...@collabora.com> diff --git a/sw/source/writerfilter/dmapper/PropertyMap.cxx b/sw/source/writerfilter/dmapper/PropertyMap.cxx index 407e8871b9e2..99db7cc7522c 100644 --- a/sw/source/writerfilter/dmapper/PropertyMap.cxx +++ b/sw/source/writerfilter/dmapper/PropertyMap.cxx @@ -1050,11 +1050,22 @@ void copyHeaderFooter(const DomainMapper_Impl& rDM_Impl, xStyle->getPropertyValue(sHeaderIsOn) >>= bHasHeader; xStyle->getPropertyValue(sFooterIsOn) >>= bHasFooter; - xStyle->setPropertyValue(sHeaderIsOn, uno::Any(bPreviousHasHeader || bHasHeader)); - xStyle->setPropertyValue(sFooterIsOn, uno::Any(bPreviousHasFooter || bHasFooter)); - xStyle->setPropertyValue(sHeaderIsShared, uno::Any(false)); - xStyle->setPropertyValue(sFooterIsShared, uno::Any(false)); - xStyle->setPropertyValue(sFirstIsShared, uno::Any(false)); + // Set all properties at once before the copy, to avoid needless SwPageDesc copying. + uno::Sequence<OUString> aNames = { + sHeaderIsOn, + sFooterIsOn, + sHeaderIsShared, + sFooterIsShared, + sFirstIsShared, + }; + uno::Sequence<uno::Any> aValues = { + uno::Any(bPreviousHasHeader || bHasHeader), + uno::Any(bPreviousHasFooter || bHasFooter), + uno::Any(false), + uno::Any(false), + uno::Any(false), + }; + xStyle->setPropertyValues(aNames, aValues); if (bPreviousHasHeader && bCopyHeader) { @@ -1076,12 +1087,22 @@ void copyHeaderFooter(const DomainMapper_Impl& rDM_Impl, copyHeaderFooterTextProperty(xPreviousStyle, xStyle, PROP_FOOTER_TEXT_FIRST); } - xStyle->setPropertyValue(sHeaderIsOn, uno::Any(bPreviousHasHeader || bHasHeader)); - xStyle->setPropertyValue(sFooterIsOn, uno::Any(bPreviousHasFooter || bHasFooter)); - - xStyle->setPropertyValue(sHeaderIsShared, uno::Any(!bEvenAndOdd)); - xStyle->setPropertyValue(sFooterIsShared, uno::Any(!bEvenAndOdd)); - xStyle->setPropertyValue(sFirstIsShared, uno::Any(!bTitlePage)); + // Set all properties at once after the copy, to avoid needless SwPageDesc copying. + aNames = { + sHeaderIsOn, + sFooterIsOn, + sHeaderIsShared, + sFooterIsShared, + sFirstIsShared, + }; + aValues = { + uno::Any(bPreviousHasHeader || bHasHeader), + uno::Any(bPreviousHasFooter || bHasFooter), + uno::Any(!bEvenAndOdd), + uno::Any(!bEvenAndOdd), + uno::Any(!bTitlePage), + }; + xStyle->setPropertyValues(aNames, aValues); } } // end anonymous namespace