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>
This commit is contained in:
parent
eae031d5c3
commit
94057bd800
@ -100,7 +100,7 @@ QDirPrivate::QDirPrivate(const QDirPrivate ©)
|
|||||||
dirEntry(copy.dirEntry)
|
dirEntry(copy.dirEntry)
|
||||||
{
|
{
|
||||||
QMutexLocker locker(©.fileCache.mutex);
|
QMutexLocker locker(©.fileCache.mutex);
|
||||||
fileCache.fileListsInitialized = copy.fileCache.fileListsInitialized;
|
fileCache.fileListsInitialized = copy.fileCache.fileListsInitialized.load();
|
||||||
fileCache.files = copy.fileCache.files;
|
fileCache.files = copy.fileCache.files;
|
||||||
fileCache.fileInfos = copy.fileCache.fileInfos;
|
fileCache.fileInfos = copy.fileCache.fileInfos;
|
||||||
fileCache.absoluteDirEntry = copy.fileCache.absoluteDirEntry;
|
fileCache.absoluteDirEntry = copy.fileCache.absoluteDirEntry;
|
||||||
@ -1378,17 +1378,29 @@ QStringList QDir::entryList(const QStringList &nameFilters, Filters filters,
|
|||||||
if (sort == NoSort)
|
if (sort == NoSort)
|
||||||
sort = d->sort;
|
sort = d->sort;
|
||||||
|
|
||||||
|
const bool needsSorting = (sort & QDir::SortByMask) != QDir::Unsorted;
|
||||||
|
|
||||||
if (filters == d->filters && sort == d->sort && nameFilters == d->nameFilters) {
|
if (filters == d->filters && sort == d->sort && nameFilters == d->nameFilters) {
|
||||||
|
// Don't fill a QFileInfo cache if we just need names
|
||||||
|
if (needsSorting || d->fileCache.fileListsInitialized) {
|
||||||
d->initFileLists(*this);
|
d->initFileLists(*this);
|
||||||
return d->fileCache.files;
|
return d->fileCache.files;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QFileInfoList l;
|
|
||||||
QDirIterator it(d->dirEntry.filePath(), nameFilters, filters);
|
QDirIterator it(d->dirEntry.filePath(), nameFilters, filters);
|
||||||
|
QStringList ret;
|
||||||
|
if (needsSorting) {
|
||||||
|
QFileInfoList l;
|
||||||
while (it.hasNext())
|
while (it.hasNext())
|
||||||
l.append(it.nextFileInfo());
|
l.append(it.nextFileInfo());
|
||||||
QStringList ret;
|
|
||||||
d->sortFileList(sort, l, &ret, nullptr);
|
d->sortFileList(sort, l, &ret, nullptr);
|
||||||
|
} else {
|
||||||
|
while (it.hasNext()) {
|
||||||
|
it.next();
|
||||||
|
ret.append(it.fileName());
|
||||||
|
}
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ public:
|
|||||||
QMutex mutex;
|
QMutex mutex;
|
||||||
QStringList files;
|
QStringList files;
|
||||||
QFileInfoList fileInfos;
|
QFileInfoList fileInfos;
|
||||||
bool fileListsInitialized = false;
|
std::atomic<bool> fileListsInitialized = false;
|
||||||
QFileSystemEntry absoluteDirEntry;
|
QFileSystemEntry absoluteDirEntry;
|
||||||
QFileSystemMetaData metaData;
|
QFileSystemMetaData metaData;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user