sal/rtl/bootstrap.cxx | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-)
New commits: commit 46d6942bc16fb291f37b0700bb531a3e0d2d11f6 Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Sun Jun 20 20:19:28 2021 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Mon Jun 21 14:27:53 2021 +0200 tdf#135316 add small cache to rtl_bootstrap_args_open Filesystem access is quite expensive on Windows, so add a small cache for the filepath/name normalisation. This takes my load time from 19s to 18s Change-Id: I4410d066b8a4d2fd2eb746a5dd8f4ee763a8aa3e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117549 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/sal/rtl/bootstrap.cxx b/sal/rtl/bootstrap.cxx index 9aa3546a5ca7..afb80dcd66cb 100644 --- a/sal/rtl/bootstrap.cxx +++ b/sal/rtl/bootstrap.cxx @@ -37,6 +37,7 @@ #include <rtl/malformeduriexception.hxx> #include <rtl/uri.hxx> #include <sal/log.hxx> +#include <o3tl/lru_map.hxx> #include <vector> #include <algorithm> @@ -588,21 +589,35 @@ bootstrap_map_t bootstrap_map; rtlBootstrapHandle SAL_CALL rtl_bootstrap_args_open(rtl_uString * pIniName) { - OUString iniName( pIniName ); + static o3tl::lru_map<OUString,OUString> fileUrlLookupCache(16); + + OUString originalIniName( pIniName ); + OUString iniName; + + osl::ResettableMutexGuard guard(osl::Mutex::getGlobalMutex()); + auto cacheIt = fileUrlLookupCache.find(originalIniName); + bool foundInCache = cacheIt != fileUrlLookupCache.end(); + if (foundInCache) + iniName = cacheIt->second; + guard.clear(); // normalize path - FileStatus status(osl_FileStatus_Mask_FileURL); - DirectoryItem dirItem; - if (DirectoryItem::get(iniName, dirItem) != DirectoryItem::E_None || - dirItem.getFileStatus(status) != DirectoryItem::E_None) + if (!foundInCache) { - return nullptr; + FileStatus status(osl_FileStatus_Mask_FileURL); + DirectoryItem dirItem; + if (DirectoryItem::get(originalIniName, dirItem) != DirectoryItem::E_None || + dirItem.getFileStatus(status) != DirectoryItem::E_None) + { + return nullptr; + } + iniName = status.getFileURL(); } - iniName = status.getFileURL(); - + guard.reset(); + if (!foundInCache) + fileUrlLookupCache.insert({originalIniName, iniName}); Bootstrap_Impl * that; - osl::ResettableMutexGuard guard(osl::Mutex::getGlobalMutex()); auto iFind(bootstrap_map.find(iniName)); if (iFind == bootstrap_map.end()) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits