From 399f8151438408894f323927296b458f4fc0b27c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Nordheim?= Date: Tue, 21 May 2019 15:13:39 +0200 Subject: qdiriterator benchmark: test against std::filesystem If c++17 is available and the header is available (not experimental/filesystem) then we'll try std::filesystem::recursive_directory_iterator as well. Results on my PC (Windows, VS 2019): PASS : tst_qdiriterator::posix(C:\depot\qt\main/src/corelib) RESULT : tst_qdiriterator::posix():"C:\depot\qt\main/src/corelib": 23 msecs per iteration (total: 94, iterations: 4) PASS : tst_qdiriterator::diriterator(C:\depot\qt\main/src/corelib) RESULT : tst_qdiriterator::diriterator():"C:\depot\qt\main/src/corelib": 17 msecs per iteration (total: 71, iterations: 4) PASS : tst_qdiriterator::stdRecursiveDirectoryIterator(C:\depot\qt\main/src/corelib) RESULT : tst_qdiriterator::stdRecursiveDirectoryIterator():"C:\depot\qt\main/src/corelib": 6.7 msecs per iteration (total: 54, iterations: 8) PASS : tst_qdiriterator::fsiterator(C:\depot\qt\main/src/corelib) RESULT : tst_qdiriterator::fsiterator():"C:\depot\qt\main/src/corelib": 23 msecs per iteration (total: 92, iterations: 4) And as a drive-by fix: move the 'data' function out of the private slots so it is not invoked as a test function (it doesn't cause any problems but is ultimately pointless). Change-Id: Ia160ee276423ec51e35e554a4cd63d4d940c0e6a Reviewed-by: Edward Welbourne --- tests/benchmarks/corelib/io/qdiriterator/main.cpp | 35 +++++++++++++++++++++- .../corelib/io/qdiriterator/qdiriterator.pro | 2 ++ 2 files changed, 36 insertions(+), 1 deletion(-) (limited to 'tests/benchmarks/corelib') diff --git a/tests/benchmarks/corelib/io/qdiriterator/main.cpp b/tests/benchmarks/corelib/io/qdiriterator/main.cpp index eae752d99a..60c75ead4d 100644 --- a/tests/benchmarks/corelib/io/qdiriterator/main.cpp +++ b/tests/benchmarks/corelib/io/qdiriterator/main.cpp @@ -44,9 +44,19 @@ #include "qfilesystemiterator.h" +#if QT_HAS_INCLUDE() && defined(__cpp_lib_filesystem) && __cpp_lib_filesystem >= 201703L +#define HAS_STD_FILESYSTEM +#endif + +#ifdef HAS_STD_FILESYSTEM +#include +#endif + class tst_qdiriterator : public QObject { Q_OBJECT + + void data(); private slots: void posix(); void posix_data() { data(); } @@ -54,7 +64,8 @@ private slots: void diriterator_data() { data(); } void fsiterator(); void fsiterator_data() { data(); } - void data(); + void stdRecursiveDirectoryIterator(); + void stdRecursiveDirectoryIterator_data() { data(); } }; @@ -235,6 +246,28 @@ void tst_qdiriterator::fsiterator() qDebug() << count; } +void tst_qdiriterator::stdRecursiveDirectoryIterator() +{ +#ifdef HAS_STD_FILESYSTEM + QFETCH(QByteArray, dirpath); + + int count = 0; + + QBENCHMARK { + int c = 0; + for (auto obj : std::filesystem::recursive_directory_iterator(dirpath.data())) { + if (obj.is_directory()) + continue; + c++; + } + count = c; + } + qDebug() << count; +#else + QSKIP("Not supported."); +#endif +} + QTEST_MAIN(tst_qdiriterator) #include "main.moc" diff --git a/tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro b/tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro index 061b22a5d1..4b28946f18 100644 --- a/tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro +++ b/tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro @@ -3,6 +3,8 @@ TARGET = tst_bench_qdiriterator QT = core testlib CONFIG += release +# Enable c++17 support for std::filesystem +qtConfig(c++1z): CONFIG += c++17 SOURCES += main.cpp qfilesystemiterator.cpp HEADERS += qfilesystemiterator.h -- cgit v1.2.3