diff options
author | Alexis Menard <alexis.menard@nokia.com> | 2009-06-15 10:09:25 (GMT) |
---|---|---|
committer | Alexis Menard <alexis.menard@nokia.com> | 2009-06-15 10:14:59 (GMT) |
commit | 44766d265c16551043d2739171069fe042c40091 (patch) | |
tree | 63c5d8e8a1a01da41f8b3578f8dd919bee93fc2c /tests/benchmarks/qdir | |
parent | 5d02b900f6070872a305f8405b504ecc01833de7 (diff) | |
download | Qt-44766d265c16551043d2739171069fe042c40091.zip Qt-44766d265c16551043d2739171069fe042c40091.tar.gz Qt-44766d265c16551043d2739171069fe042c40091.tar.bz2 |
Improve the speed of QDir, QFileInfo and QDirIterator.
This patch basically avoid to call too often currentFileInfo in
QDirIterator. It replaces the QHash that was overkill in QFileInfo for
caching filenames. The last part is reordering the matchesFilter
to avoid stat as much as possible by using the power of && and filters
that are set on QDirIterator. And it fixes some random "mistake".
I have added a benchmark in QDir which test some use case with
10000 files in a dir.
Written-with: Benjamin
Reviewed-by: phartman
Diffstat (limited to 'tests/benchmarks/qdir')
-rw-r--r-- | tests/benchmarks/qdir/qdir.pro | 8 | ||||
-rw-r--r-- | tests/benchmarks/qdir/tst_qdir.cpp | 96 |
2 files changed, 104 insertions, 0 deletions
diff --git a/tests/benchmarks/qdir/qdir.pro b/tests/benchmarks/qdir/qdir.pro new file mode 100644 index 0000000..2cdebfd --- /dev/null +++ b/tests/benchmarks/qdir/qdir.pro @@ -0,0 +1,8 @@ +load(qttest_p4) +TEMPLATE = app +TARGET = tst_qdir +DEPENDPATH += . +INCLUDEPATH += . + +# Input +SOURCES += tst_qdir.cpp diff --git a/tests/benchmarks/qdir/tst_qdir.cpp b/tests/benchmarks/qdir/tst_qdir.cpp new file mode 100644 index 0000000..c95ff96 --- /dev/null +++ b/tests/benchmarks/qdir/tst_qdir.cpp @@ -0,0 +1,96 @@ +#include <QtTest/QtTest> + +#include<dirent.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> + +class Test : public QObject{ + Q_OBJECT +public slots: + void initTestCase() { + QDir testdir = QDir::tempPath(); + + const QString subfolder_name = QLatin1String("test_speed"); + QVERIFY(testdir.mkdir(subfolder_name)); + QVERIFY(testdir.cd(subfolder_name)); + + for (uint i=0; i<10000; ++i) { + QFile file(testdir.absolutePath() + "/testfile_" + QString::number(i)); + file.open(QIODevice::WriteOnly); + } + } + void cleanupTestCase() { + { + QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); + + foreach (const QString &filename, testdir.entryList()) { + testdir.remove(filename); + } + } + const QDir temp = QDir(QDir::tempPath()); + temp.rmdir(QLatin1String("test_speed")); + } +private slots: + void sizeSpeed() { + QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); + QBENCHMARK { + QFileInfoList fileInfoList = testdir.entryInfoList(QDir::Files, QDir::Unsorted); + foreach (const QFileInfo &fileInfo, fileInfoList) { + fileInfo.isDir(); + fileInfo.size(); + } + } + } + void sizeSpeedWithoutFilter() { + QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); + QBENCHMARK { + QFileInfoList fileInfoList = testdir.entryInfoList(QDir::NoFilter, QDir::Unsorted); + foreach (const QFileInfo &fileInfo, fileInfoList) { + fileInfo.size(); + } + } + } + void sizeSpeedWithoutFileInfoList() { + QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); + testdir.setSorting(QDir::Unsorted); + QBENCHMARK { + QStringList fileList = testdir.entryList(QDir::NoFilter, QDir::Unsorted); + foreach (const QString &filename, fileList) { + QFileInfo fileInfo(filename); + fileInfo.size(); + } + } + } + void iDontWantAnyStat() { + QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); + testdir.setSorting(QDir::Unsorted); + testdir.setFilter(QDir::AllEntries | QDir::System | QDir::Hidden); + QBENCHMARK { + QStringList fileList = testdir.entryList(QDir::NoFilter, QDir::Unsorted); + foreach (const QString &filename, fileList) { + + } + } + } + void testLowLevel() { + QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); + DIR *dir = opendir(qPrintable(testdir.absolutePath())); + QVERIFY(!chdir(qPrintable(testdir.absolutePath()))); + QBENCHMARK { + struct dirent *item = readdir(dir); + while (item) { + char *fileName = item->d_name; + + struct stat fileStat; + QVERIFY(!stat(fileName, &fileStat)); + + item = readdir(dir); + } + } + closedir(dir); + } +}; + +QTEST_MAIN(Test) +#include "tst_qdir.moc" |