summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Faure <david.faure@kdab.com>2023-02-02 20:11:37 +0100
committerDavid Faure <david.faure@kdab.com>2023-02-07 13:33:01 +0100
commit94057bd800577b6cc770d93a235859e280ed1c63 (patch)
tree425ceac05e0222b49af78a2fa7667f595bde2696
parenteae031d5c3b02ad1d0ffe3377b252acae9294877 (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.cpp26
-rw-r--r--src/corelib/io/qdir_p.h2
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 &copy)
dirEntry(copy.dirEntry)
{
QMutexLocker locker(&copy.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;
};