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

Reply via email to