From cb77dc1a8f3713894a341b0b94e927c5770b3c5c Mon Sep 17 00:00:00 2001 From: Stephen Anthony Date: Wed, 18 Sep 2024 20:42:24 -0230 Subject: [PATCH] Potential speedup in Windows FSNode::getChildren(). Worst case is it doesn't improve at all. --- src/os/windows/FSNodeWINDOWS.cxx | 47 ++++++++++++++++---------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/src/os/windows/FSNodeWINDOWS.cxx b/src/os/windows/FSNodeWINDOWS.cxx index 6ae7ff1ae..2850e8cfe 100644 --- a/src/os/windows/FSNodeWINDOWS.cxx +++ b/src/os/windows/FSNodeWINDOWS.cxx @@ -110,28 +110,7 @@ AbstractFSNodePtr FSNodeWINDOWS::getParent() const // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool FSNodeWINDOWS::getChildren(AbstractFSList& myList, ListMode mode) const { - if (_isPseudoRoot) - { - // Drives enumeration - TCHAR drive_buffer[100]; - GetLogicalDriveStrings(sizeof(drive_buffer) / sizeof(TCHAR), drive_buffer); - - char drive_name[2] = { '\0', '\0' }; - for (TCHAR *current_drive = drive_buffer; *current_drive; - current_drive += _tcslen(current_drive) + 1) - { - FSNodeWINDOWS entry; - - drive_name[0] = current_drive[0]; - entry._displayName = drive_name; - entry._isDirectory = true; - entry._isFile = false; - entry._isPseudoRoot = false; - entry._path = current_drive; - myList.emplace_back(make_unique(entry)); - } - } - else + if (!_isPseudoRoot) [[likely]] { // Files enumeration WIN32_FIND_DATA desc{}; @@ -166,11 +145,31 @@ bool FSNodeWINDOWS::getChildren(AbstractFSList& myList, ListMode mode) const entry._size = desc.nFileSizeHigh * (static_cast(MAXDWORD) + 1) + desc.nFileSizeLow; myList.emplace_back(make_unique(entry)); - } - while (FindNextFile(handle, &desc)); + } while (FindNextFile(handle, &desc)); FindClose(handle); } + else + { + // Drives enumeration + TCHAR drive_buffer[100]; + GetLogicalDriveStrings(sizeof(drive_buffer) / sizeof(TCHAR), drive_buffer); + + char drive_name[2] = { '\0', '\0' }; + for (TCHAR *current_drive = drive_buffer; *current_drive; + current_drive += _tcslen(current_drive) + 1) + { + FSNodeWINDOWS entry; + + drive_name[0] = current_drive[0]; + entry._displayName = drive_name; + entry._isDirectory = true; + entry._isFile = false; + entry._isPseudoRoot = false; + entry._path = current_drive; + myList.emplace_back(make_unique(entry)); + } + } return true; }