svl/source/notify/SfxBroadcaster.cxx |   29 ++++++++++++++++++++++++-----
 1 file changed, 24 insertions(+), 5 deletions(-)

New commits:
commit 20083840700518d8c0ec314974249254eb859de7
Author: Noel Grandin <noel.gran...@collabora.co.uk>
Date:   Thu Jun 14 17:02:05 2018 +0200

    tdf#94792 performance regression for xlsx with chart with >1000 data labels
    
    this speeds things up by 30% for me
    
    Change-Id: I7fa99e91b0b4f354329803b9c8fab827bd367dac
    Reviewed-on: https://gerrit.libreoffice.org/55812
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/svl/source/notify/SfxBroadcaster.cxx 
b/svl/source/notify/SfxBroadcaster.cxx
index f4e00e860333..2e312a80ce85 100644
--- a/svl/source/notify/SfxBroadcaster.cxx
+++ b/svl/source/notify/SfxBroadcaster.cxx
@@ -124,13 +124,32 @@ void SfxBroadcaster::Forward(SfxBroadcaster& rBC, const 
SfxHint& rHint)
 void SfxBroadcaster::RemoveListener( SfxListener& rListener )
 {
     DBG_TESTSOLARMUTEX();
-    SfxListenerArr_Impl::iterator aIter = std::find(
-            mpImpl->m_Listeners.begin(), mpImpl->m_Listeners.end(), 
&rListener);
-    assert(aIter != mpImpl->m_Listeners.end()); // "RemoveListener: Listener 
unknown"
+
+    // First, check the slots either side of the last removed slot, makes a 
significant
+    // difference when the list is large.
+    int positionOfRemovedElement = -1;
+    if (!mpImpl->m_RemovedPositions.empty())
+    {
+        auto i = mpImpl->m_RemovedPositions.back();
+        if (i < mpImpl->m_Listeners.size() - 2 && mpImpl->m_Listeners[i+1] == 
&rListener)
+        {
+            positionOfRemovedElement = i + 1;
+        }
+        else if (i > 0 && mpImpl->m_Listeners[i-1] == &rListener)
+        {
+            positionOfRemovedElement = i-1;
+        }
+    }
+    // then scan the whole list if we didn't find it
+    if (positionOfRemovedElement == -1)
+    {
+        SfxListenerArr_Impl::iterator aIter = std::find(
+                mpImpl->m_Listeners.begin(), mpImpl->m_Listeners.end(), 
&rListener);
+        positionOfRemovedElement = std::distance(mpImpl->m_Listeners.begin(), 
aIter);
+    }
     // DO NOT erase the listener, set the pointer to 0
     // because the current continuation may contain this->Broadcast
-    *aIter = nullptr;
-    size_t positionOfRemovedElement = 
std::distance(mpImpl->m_Listeners.begin(), aIter);
+    mpImpl->m_Listeners[positionOfRemovedElement] = nullptr;
     mpImpl->m_RemovedPositions.push_back(positionOfRemovedElement);
 }
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to