summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/io/qdir.cpp15
-rw-r--r--tests/benchmarks/corelib/io/qdir/10000/bench_qdir_10000.cpp12
2 files changed, 25 insertions, 2 deletions
diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp
index 59b93f1331..2753d63f0e 100644
--- a/src/corelib/io/qdir.cpp
+++ b/src/corelib/io/qdir.cpp
@@ -232,9 +232,20 @@ bool QDirSortItemComparator::operator()(const QDirSortItem &n1, const QDirSortIt
| (qt_cmp_si_sort_flags & QDir::Type);
switch (sortBy) {
- case QDir::Time:
- r = f1->item.lastModified().secsTo(f2->item.lastModified());
+ case QDir::Time: {
+ QDateTime firstModified = f1->item.lastModified();
+ QDateTime secondModified = f2->item.lastModified();
+
+ // QDateTime by default will do all sorts of conversions on these to
+ // find timezones, which is incredibly expensive. As we aren't
+ // presenting these to the user, we don't care (at all) about the
+ // local timezone, so force them to UTC to avoid that conversion.
+ firstModified.setTimeSpec(Qt::UTC);
+ secondModified.setTimeSpec(Qt::UTC);
+
+ r = firstModified.secsTo(secondModified);
break;
+ }
case QDir::Size:
r = int(qBound<qint64>(-1, f2->item.size() - f1->item.size(), 1));
break;
diff --git a/tests/benchmarks/corelib/io/qdir/10000/bench_qdir_10000.cpp b/tests/benchmarks/corelib/io/qdir/10000/bench_qdir_10000.cpp
index 2de98eff0b..d741ae795c 100644
--- a/tests/benchmarks/corelib/io/qdir/10000/bench_qdir_10000.cpp
+++ b/tests/benchmarks/corelib/io/qdir/10000/bench_qdir_10000.cpp
@@ -155,6 +155,18 @@ private slots:
}
}
+ void sorted_byTime() {
+ QDir testdir(QDir::tempPath() + QLatin1String("/test_speed"));
+ testdir.setSorting(QDir::Time);
+ testdir.setFilter(QDir::AllEntries | QDir::System | QDir::Hidden);
+ QBENCHMARK {
+ QStringList fileList = testdir.entryList(QDir::NoFilter, QDir::Time);
+ foreach (const QString &filename, fileList) {
+
+ }
+ }
+ }
+
void sizeSpeedWithoutFilterLowLevel() {
QDir testdir(QDir::tempPath() + QLatin1String("/test_speed"));
#ifdef Q_OS_WIN