summaryrefslogtreecommitdiffstats
path: root/tests/benchmarks
diff options
context:
space:
mode:
authorAlexis Menard <alexis.menard@nokia.com>2009-06-15 10:09:25 (GMT)
committerAlexis Menard <alexis.menard@nokia.com>2009-06-15 10:14:59 (GMT)
commit44766d265c16551043d2739171069fe042c40091 (patch)
tree63c5d8e8a1a01da41f8b3578f8dd919bee93fc2c /tests/benchmarks
parent5d02b900f6070872a305f8405b504ecc01833de7 (diff)
downloadQt-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')
-rw-r--r--tests/benchmarks/qdir/qdir.pro8
-rw-r--r--tests/benchmarks/qdir/tst_qdir.cpp96
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"