forked from amazingfate/loongoffice
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>
59 lines
1.4 KiB
C++
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: */
|