From 7e11ca06f69e3c6b5b21365232297259930548fe Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Sat, 10 Jan 2015 10:48:28 +0100 Subject: [PATCH] Cache results of `normalizePath` `normalizePath` is a rather expensive operation and called multiple times for a single path for every file related operation. In my development installation with about 9GB of data and 60k files this leads to a performance boost of 24% - in seconds that are 1.86s (!) - for simple searches. With more files the impact will be even more noticeable. Obviously this affects every operation that has in any regard something to do with using OC\Files\Filesystem. Part of https://github.com/owncloud/core/issues/13221 --- lib/private/files/filesystem.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/private/files/filesystem.php b/lib/private/files/filesystem.php index ed2be59c092..bc43eb5d1ce 100644 --- a/lib/private/files/filesystem.php +++ b/lib/private/files/filesystem.php @@ -47,6 +47,8 @@ class Filesystem { static private $usersSetup = array(); + static private $normalizedPathCache = array(); + /** * classname which used for hooks handling * used as signalclass in OC_Hooks::emit() @@ -713,6 +715,12 @@ class Filesystem { * @return string */ public static function normalizePath($path, $stripTrailingSlash = true, $isAbsolutePath = false) { + $cacheKey = $path.'-'.-$stripTrailingSlash.'-'.$isAbsolutePath; + + if(isset(self::$normalizedPathCache[$cacheKey])) { + return self::$normalizedPathCache[$cacheKey]; + } + if ($path == '') { return '/'; } @@ -756,7 +764,10 @@ class Filesystem { //normalize unicode if possible $path = \OC_Util::normalizeUnicode($path); - return $windows_drive_letter . $path; + $normalizedPath = $windows_drive_letter . $path; + self::$normalizedPathCache[$cacheKey] = $normalizedPath; + + return $normalizedPath; } /** -- 2.39.5