diff options
author | David Faure <david.faure@kdab.com> | 2023-02-02 20:11:37 +0100 |
---|---|---|
committer | David Faure <david.faure@kdab.com> | 2023-02-07 13:33:01 +0100 |
commit | 94057bd800577b6cc770d93a235859e280ed1c63 (patch) | |
tree | 425ceac05e0222b49af78a2fa7667f595bde2696 | |
parent | eae031d5c3b02ad1d0ffe3377b252acae9294877 (diff) |
QDir::entryList: don't fill a QFileInfo cache if we just want names
This improves the performance of tst_QDir_10000::iDontWantAnyStat
(QDir::entryList Unsorted)
from 9.7ms to 7.2ms, i.e. the same as iDontWantAnyStatIterator
(QDirIterator).
Change-Id: I3faf8af1a55575df97912b1ce720492c8fd903c9
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r-- | src/corelib/io/qdir.cpp | 26 | ||||
-rw-r--r-- | src/corelib/io/qdir_p.h | 2 |
2 files changed, 20 insertions, 8 deletions
diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp index 21204ff10b..b08595bf14 100644 --- a/src/corelib/io/qdir.cpp +++ b/src/corelib/io/qdir.cpp @@ -100,7 +100,7 @@ QDirPrivate::QDirPrivate(const QDirPrivate ©) dirEntry(copy.dirEntry) { QMutexLocker locker(©.fileCache.mutex); - fileCache.fileListsInitialized = copy.fileCache.fileListsInitialized; + fileCache.fileListsInitialized = copy.fileCache.fileListsInitialized.load(); fileCache.files = copy.fileCache.files; fileCache.fileInfos = copy.fileCache.fileInfos; fileCache.absoluteDirEntry = copy.fileCache.absoluteDirEntry; @@ -1378,17 +1378,29 @@ QStringList QDir::entryList(const QStringList &nameFilters, Filters filters, if (sort == NoSort) sort = d->sort; + const bool needsSorting = (sort & QDir::SortByMask) != QDir::Unsorted; + if (filters == d->filters && sort == d->sort && nameFilters == d->nameFilters) { - d->initFileLists(*this); - return d->fileCache.files; + // Don't fill a QFileInfo cache if we just need names + if (needsSorting || d->fileCache.fileListsInitialized) { + d->initFileLists(*this); + return d->fileCache.files; + } } - QFileInfoList l; QDirIterator it(d->dirEntry.filePath(), nameFilters, filters); - while (it.hasNext()) - l.append(it.nextFileInfo()); QStringList ret; - d->sortFileList(sort, l, &ret, nullptr); + if (needsSorting) { + QFileInfoList l; + while (it.hasNext()) + l.append(it.nextFileInfo()); + d->sortFileList(sort, l, &ret, nullptr); + } else { + while (it.hasNext()) { + it.next(); + ret.append(it.fileName()); + } + } return ret; } diff --git a/src/corelib/io/qdir_p.h b/src/corelib/io/qdir_p.h index 3e033b2ad2..7dce69c195 100644 --- a/src/corelib/io/qdir_p.h +++ b/src/corelib/io/qdir_p.h @@ -71,7 +71,7 @@ public: QMutex mutex; QStringList files; QFileInfoList fileInfos; - bool fileListsInitialized = false; + std::atomic<bool> fileListsInitialized = false; QFileSystemEntry absoluteDirEntry; QFileSystemMetaData metaData; }; |