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

Reply via email to