summaryrefslogtreecommitdiff
path: root/src/db/plugins/simple/Directory.cxx
diff options
context:
space:
mode:
authorMax Kellermann <max@musicpd.org>2020-04-02 15:36:58 +0200
committerMax Kellermann <max@musicpd.org>2020-04-02 16:12:08 +0200
commitcdddaf21b006163fa771ab2a626925d5bbaa0eb9 (patch)
tree9ee51e209c7ff2b4038f91ebe10ac567d1e3c776 /src/db/plugins/simple/Directory.cxx
parentb267ba5f0a79817de1f1c52d5c3896cdb4a3f682 (diff)
db/simple/Directory: optimize GetName() using the parent's path
This method gets called a lot during MPD startup, via FindChild() and directory_load_subdir(), so this is worth optimizing at the expense of code readability. This speeds up MPD startup by 10%.
Diffstat (limited to 'src/db/plugins/simple/Directory.cxx')
-rw-r--r--src/db/plugins/simple/Directory.cxx11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/db/plugins/simple/Directory.cxx b/src/db/plugins/simple/Directory.cxx
index 27602afc2..66aa6cd48 100644
--- a/src/db/plugins/simple/Directory.cxx
+++ b/src/db/plugins/simple/Directory.cxx
@@ -32,6 +32,7 @@
#include "fs/Traits.hxx"
#include "util/Alloc.hxx"
#include "util/DeleteDisposer.hxx"
+#include "util/StringCompare.hxx"
#include <assert.h>
#include <string.h>
@@ -69,7 +70,15 @@ Directory::GetName() const noexcept
{
assert(!IsRoot());
- return PathTraitsUTF8::GetBase(path.c_str());
+ if (parent->IsRoot())
+ return path.c_str();
+
+ assert(StringAfterPrefix(path.c_str(), parent->path.c_str()) != nullptr);
+ assert(*StringAfterPrefix(path.c_str(), parent->path.c_str()) == PathTraitsUTF8::SEPARATOR);
+
+ /* strip the parent directory path and the slash separator
+ from this directory's path, and the base name remains */
+ return path.c_str() + parent->path.length() + 1;
}
Directory *