svl/source/notify/broadcast.cxx | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
New commits: commit 048ee6a997c0fdd4be5821b6edb36dd007479f72 Author: Luboš Luňák <l.lu...@collabora.com> AuthorDate: Thu Jun 25 10:02:47 2020 +0200 Commit: Luboš Luňák <l.lu...@collabora.com> CommitDate: Thu Jun 25 10:45:51 2020 +0200 optimize SvtBroadcaster::Normalize() a bit more (tdf#132454) A common case is just one unsorted item at the end, in that case it's even more efficient to simply insert it in the right place. This further improves the tdf#132454 undo operation 36s->27s. Change-Id: I29db80fb8292e827b655000cddc462cf87cb485d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/97088 Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> Reviewed-by: Luboš Luňák <l.lu...@collabora.com> Tested-by: Jenkins diff --git a/svl/source/notify/broadcast.cxx b/svl/source/notify/broadcast.cxx index cc1ffcb10917..de7ec6b4374e 100644 --- a/svl/source/notify/broadcast.cxx +++ b/svl/source/notify/broadcast.cxx @@ -29,13 +29,20 @@ void SvtBroadcaster::Normalize() const if (!mbNormalized) { // Add() only appends new values, so often the container will be sorted expect for one - // or few last items. For larger containers it is much more efficient to just sort - // the unsorted part and then merge. + // or few last items. For larger containers it is much more efficient to just handle + // the unsorted part. if(maListeners.size() > 100) { auto sortedEnd = std::is_sorted_until(maListeners.begin(),maListeners.end()); - if( o3tl::make_unsigned( sortedEnd - maListeners.begin()) > maListeners.size() * 3 / 4 ) - { + if( maListeners.end() - sortedEnd == 1 ) + { // Just one item, insert it in the right place. + SvtListener* item = maListeners.back(); + maListeners.pop_back(); + maListeners.insert( std::upper_bound( maListeners.begin(), maListeners.end(), item ), item ); + mbNormalized = true; + } + else if( o3tl::make_unsigned( sortedEnd - maListeners.begin()) > maListeners.size() * 3 / 4 ) + { // Sort the unsorted part and then merge. std::sort( sortedEnd, maListeners.end()); std::inplace_merge( maListeners.begin(), sortedEnd, maListeners.end()); mbNormalized = true; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits