diff options
-rw-r--r-- | src/corelib/io/qdir.cpp | 15 | ||||
-rw-r--r-- | tests/benchmarks/corelib/io/qdir/10000/bench_qdir_10000.cpp | 12 |
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 |