summaryrefslogtreecommitdiff
path: root/sw/source/core/txtnode/thints.cxx
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2021-08-25 09:20:49 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2021-08-25 10:47:17 +0200
commitc6883e7a031dec5fe3a365c4fd6adccff09696e5 (patch)
tree39835ac09f04d212a5cd2c2c748013830f578fad /sw/source/core/txtnode/thints.cxx
parent5f11e921fb878cc6fd6a15181a416e0143e389f7 (diff)
tdf#64991 speed up loading large RTL documents
takes load time from 3min49 to 2min59 for me Use std::vector<bool> for RsidOnlyAutoFormatFlagMap, we only add values to the end so it is easy to correctly size this; and std::vectior<bool> is way more cache-dense Change-Id: Ia607c6a4d80a49a25d487d9ddde5041c166e966c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/121009 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'sw/source/core/txtnode/thints.cxx')
-rw-r--r--sw/source/core/txtnode/thints.cxx13
1 files changed, 7 insertions, 6 deletions
diff --git a/sw/source/core/txtnode/thints.cxx b/sw/source/core/txtnode/thints.cxx
index 1b88a49b498d..995d82606dab 100644
--- a/sw/source/core/txtnode/thints.cxx
+++ b/sw/source/core/txtnode/thints.cxx
@@ -2620,7 +2620,7 @@ static MergeResult lcl_Compare_Attributes(
int i, int j,
const std::pair< PortionMap::iterator, PortionMap::iterator >& aRange1,
const std::pair< PortionMap::iterator, PortionMap::iterator >& aRange2,
- std::unordered_map<int, bool>& RsidOnlyAutoFormatFlagMap);
+ std::vector<bool>& RsidOnlyAutoFormatFlagMap);
bool SwpHints::MergePortions( SwTextNode& rNode )
{
@@ -2632,9 +2632,10 @@ bool SwpHints::MergePortions( SwTextNode& rNode )
bool bRet = false;
PortionMap aPortionMap;
- std::unordered_map<int, bool> RsidOnlyAutoFormatFlagMap;
+ std::vector<bool> RsidOnlyAutoFormatFlagMap;
+ RsidOnlyAutoFormatFlagMap.resize(Count() + 1);
sal_Int32 nLastPorStart = COMPLETE_STRING;
- int nKey = 0;
+ sal_Int32 nKey = 0;
// get portions by start position:
for ( size_t i = 0; i < Count(); ++i )
@@ -2784,15 +2785,15 @@ static MergeResult lcl_Compare_Attributes(
int i, int j,
const std::pair< PortionMap::iterator, PortionMap::iterator >& aRange1,
const std::pair< PortionMap::iterator, PortionMap::iterator >& aRange2,
- std::unordered_map<int, bool>& RsidOnlyAutoFormatFlagMap)
+ std::vector<bool>& RsidOnlyAutoFormatFlagMap)
{
PortionMap::iterator aIter1 = aRange1.first;
PortionMap::iterator aIter2 = aRange2.first;
size_t const nAttributesInPor1 = std::distance(aRange1.first, aRange1.second);
size_t const nAttributesInPor2 = std::distance(aRange2.first, aRange2.second);
- bool const isRsidOnlyAutoFormat1(RsidOnlyAutoFormatFlagMap[i]);
- bool const isRsidOnlyAutoFormat2(RsidOnlyAutoFormatFlagMap[j]);
+ bool const isRsidOnlyAutoFormat1 = i < sal_Int32(RsidOnlyAutoFormatFlagMap.size()) && RsidOnlyAutoFormatFlagMap[i];
+ bool const isRsidOnlyAutoFormat2 = j < sal_Int32(RsidOnlyAutoFormatFlagMap.size()) && RsidOnlyAutoFormatFlagMap[j];
// if both have one they could be equal, but not if only one has it
bool const bSkipRsidOnlyAutoFormat(nAttributesInPor1 != nAttributesInPor2);