Files
loongoffice/sc/source/core/tool/sharedstringpoolpurge.cxx
Luboš Luňák 5b2a153779 do not call purge() on string pool too often (tdf#125428)
It turns out svl::SharedStringPool::purge() can be somewhat
expensive with larger documents. Profiling suggests it's primarily
the cost of the CPU trying to access the rtl_uString instances
scattered all over the memory, so it can't be easily optimized.
So instead delay and compress purge() calls if they come from
temporary ScDocument instances from undo or clipboard.

Change-Id: Ie26cce113025ff45ee2c473c6b06f684f453b27b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129713
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
2022-02-10 15:18:48 +01:00

59 lines
1.4 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
*/
#include <sharedstringpoolpurge.hxx>
#include <algorithm>
#include <vcl/svapp.hxx>
namespace sc
{
SharedStringPoolPurge::SharedStringPoolPurge()
: mTimer("SharedStringPoolPurge")
{
mTimer.SetPriority(TaskPriority::LOWEST);
mTimer.SetTimeout(10000); // 10 sec
mTimer.SetInvokeHandler(LINK(this, SharedStringPoolPurge, timerHandler));
}
SharedStringPoolPurge::~SharedStringPoolPurge() { cleanup(); }
void SharedStringPoolPurge::delayedPurge(const std::shared_ptr<svl::SharedStringPool>& pool)
{
if (std::find(mPoolsToPurge.begin(), mPoolsToPurge.end(), pool) == mPoolsToPurge.end())
{
mPoolsToPurge.push_back(pool);
SolarMutexGuard guard;
mTimer.Start();
}
}
void SharedStringPoolPurge::cleanup()
{
for (std::shared_ptr<svl::SharedStringPool>& pool : mPoolsToPurge)
{
if (pool.use_count() > 1)
pool->purge();
}
mPoolsToPurge.clear();
}
IMPL_LINK_NOARG(SharedStringPoolPurge, timerHandler, Timer*, void)
{
SolarMutexGuard guard;
mTimer.Stop();
cleanup();
}
} // namespace
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */