From 94057bd800577b6cc770d93a235859e280ed1c63 Mon Sep 17 00:00:00 2001 From: David Faure Date: Thu, 2 Feb 2023 20:11:37 +0100 Subject: [PATCH] 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 --- src/corelib/io/qdir.cpp | 26 +++++++++++++++++++------- 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 21204ff10bc..b08595bf14c 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 3e033b2ad2e..7dce69c1952 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 fileListsInitialized = false; QFileSystemEntry absoluteDirEntry; QFileSystemMetaData metaData; };