writerfilter/source/dmapper/PropertyMap.cxx | 44 +++++++++++++++++++++------- 1 file changed, 33 insertions(+), 11 deletions(-)
New commits: commit 6cf67700c1131fb5399455380df91cc8704cd4d1 Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Tue Aug 6 08:30:22 2024 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Mon Aug 19 21:41:52 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) (cherry picked from commit cf22d66c5837f108296b37bc98f17ee96869a7ef) Change-Id: Iea99fb3ad9d3e61494c9f012c4c7fa10cc7ab09d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171579 Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Tested-by: Caolán McNamara <caolan.mcnam...@collabora.com> (cherry picked from commit f33e6d336da5c69de8a36bf95b2158596ba25e35) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171990 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/writerfilter/source/dmapper/PropertyMap.cxx b/writerfilter/source/dmapper/PropertyMap.cxx index 8846b2b8e87c..f1c77b77bd4c 100644 --- a/writerfilter/source/dmapper/PropertyMap.cxx +++ b/writerfilter/source/dmapper/PropertyMap.cxx @@ -1024,11 +1024,23 @@ 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), + }; + uno::Reference<beans::XMultiPropertySet> xMultiPropertySet(xStyle, uno::UNO_QUERY); + xMultiPropertySet->setPropertyValues(aNames, aValues); if (bPreviousHasHeader && bCopyHeader) { @@ -1050,12 +1062,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), + }; + xMultiPropertySet->setPropertyValues(aNames, aValues); } } // end anonymous namespace