diff options
Diffstat (limited to 'tests/benchmarks/corelib')
158 files changed, 4672 insertions, 4637 deletions
diff --git a/tests/benchmarks/corelib/CMakeLists.txt b/tests/benchmarks/corelib/CMakeLists.txt index ff30862180..890cbcfc6b 100644 --- a/tests/benchmarks/corelib/CMakeLists.txt +++ b/tests/benchmarks/corelib/CMakeLists.txt @@ -1,12 +1,16 @@ -# Generated from corelib.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause add_subdirectory(io) add_subdirectory(itemmodels) add_subdirectory(json) -add_subdirectory(mimetypes) +if(QT_FEATURE_mimetype) + add_subdirectory(mimetypes) +endif() add_subdirectory(kernel) add_subdirectory(text) add_subdirectory(thread) add_subdirectory(time) add_subdirectory(tools) add_subdirectory(plugin) +add_subdirectory(serialization) diff --git a/tests/benchmarks/corelib/io/CMakeLists.txt b/tests/benchmarks/corelib/io/CMakeLists.txt index 3419c4a28c..e9bf2292c0 100644 --- a/tests/benchmarks/corelib/io/CMakeLists.txt +++ b/tests/benchmarks/corelib/io/CMakeLists.txt @@ -1,12 +1,14 @@ -# Generated from io.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause add_subdirectory(qdir) add_subdirectory(qdiriterator) add_subdirectory(qfile) add_subdirectory(qfileinfo) add_subdirectory(qiodevice) -add_subdirectory(qtemporaryfile) -add_subdirectory(qtextstream) if(QT_FEATURE_process) add_subdirectory(qprocess) endif() +add_subdirectory(qtemporaryfile) +add_subdirectory(qtextstream) +add_subdirectory(qurl) diff --git a/tests/benchmarks/corelib/io/qdir/10000/CMakeLists.txt b/tests/benchmarks/corelib/io/qdir/10000/CMakeLists.txt index e83c4e9acc..142c13aceb 100644 --- a/tests/benchmarks/corelib/io/qdir/10000/CMakeLists.txt +++ b/tests/benchmarks/corelib/io/qdir/10000/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from 10000.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qdir_10000 Binary: @@ -6,10 +7,7 @@ qt_internal_add_benchmark(tst_bench_qdir_10000 SOURCES - bench_qdir_10000.cpp - PUBLIC_LIBRARIES + tst_bench_qdir_10000.cpp + LIBRARIES Qt::Test ) - -#### Keys ignored in scope 1:.:.:10000.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/io/qdir/10000/bench_qdir_10000.cpp b/tests/benchmarks/corelib/io/qdir/10000/tst_bench_qdir_10000.cpp index 3184df0d7b..a53742b536 100644 --- a/tests/benchmarks/corelib/io/qdir/10000/bench_qdir_10000.cpp +++ b/tests/benchmarks/corelib/io/qdir/10000/tst_bench_qdir_10000.cpp @@ -1,36 +1,13 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#undef QT_NO_FOREACH // this file contains unported legacy Q_FOREACH uses #include <QTest> #include <QDirIterator> #ifdef Q_OS_WIN -# include <windows.h> +# include <qt_windows.h> #else # include <sys/stat.h> # include <sys/types.h> @@ -38,10 +15,12 @@ # include <unistd.h> #endif -class bench_QDir_10000 : public QObject{ - Q_OBJECT +class tst_QDir_10000 : public QObject +{ + Q_OBJECT public slots: - void initTestCase() { + void initTestCase() + { QDir testdir = QDir::tempPath(); const QString subfolder_name = QLatin1String("test_speed"); @@ -53,24 +32,16 @@ public slots: file.open(QIODevice::WriteOnly); } } - void cleanupTestCase() { - { - QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); - testdir.setSorting(QDir::Unsorted); - testdir.setFilter(QDir::AllEntries | QDir::System | QDir::Hidden); - foreach (const QString &filename, testdir.entryList()) { - testdir.remove(filename); - } - } - const QDir temp = QDir(QDir::tempPath()); - temp.rmdir(QLatin1String("test_speed")); + void cleanupTestCase() + { + QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); + QVERIFY(testdir.removeRecursively()); } private slots: - void baseline() {} - - void sizeSpeed() { - QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); + void sizeSpeed() + { QBENCHMARK { + QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); QFileInfoList fileInfoList = testdir.entryInfoList(QDir::Files, QDir::Unsorted); foreach (const QFileInfo &fileInfo, fileInfoList) { fileInfo.isDir(); @@ -78,43 +49,47 @@ private slots: } } } - void sizeSpeedIterator() { - QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); + void sizeSpeedIterator() + { QBENCHMARK { + QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); QDirIterator dit(testdir.path(), QDir::Files); while (dit.hasNext()) { - dit.next(); - dit.fileInfo().isDir(); - dit.fileInfo().size(); + const auto fi = dit.nextFileInfo(); + (void)fi.isDir(); + (void)fi.size(); } } } - void sizeSpeedWithoutFilter() { - QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); + void sizeSpeedWithoutFilter() + { QBENCHMARK { + QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); QFileInfoList fileInfoList = testdir.entryInfoList(QDir::NoFilter, QDir::Unsorted); foreach (const QFileInfo &fileInfo, fileInfoList) { fileInfo.size(); } } } - void sizeSpeedWithoutFilterIterator() { - QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); + void sizeSpeedWithoutFilterIterator() + { QBENCHMARK { + QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); QDirIterator dit(testdir.path()); while (dit.hasNext()) { - dit.next(); - dit.fileInfo().isDir(); - dit.fileInfo().size(); + const auto fi = dit.nextFileInfo(); + (void)fi.isDir(); + (void)fi.size(); } } } - void sizeSpeedWithoutFileInfoList() { - QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); - testdir.setSorting(QDir::Unsorted); + void sizeSpeedWithoutFileInfoList() + { QBENCHMARK { + QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); + testdir.setSorting(QDir::Unsorted); QStringList fileList = testdir.entryList(QDir::NoFilter, QDir::Unsorted); foreach (const QString &filename, fileList) { QFileInfo fileInfo(filename); @@ -123,18 +98,20 @@ private slots: } } - void iDontWantAnyStat() { - QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); - testdir.setSorting(QDir::Unsorted); - testdir.setFilter(QDir::AllEntries | QDir::System | QDir::Hidden); + void iDontWantAnyStat() + { QBENCHMARK { + QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); + testdir.setSorting(QDir::Unsorted); + testdir.setFilter(QDir::AllEntries | QDir::System | QDir::Hidden); QStringList fileList = testdir.entryList(QDir::NoFilter, QDir::Unsorted); foreach (const QString &filename, fileList) { Q_UNUSED(filename); } } } - void iDontWantAnyStatIterator() { + void iDontWantAnyStatIterator() + { QBENCHMARK { QDirIterator dit(QDir::tempPath() + QLatin1String("/test_speed")); while (dit.hasNext()) { @@ -143,11 +120,12 @@ private slots: } } - void sorted_byTime() { - QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); - testdir.setSorting(QDir::Time); - testdir.setFilter(QDir::AllEntries | QDir::System | QDir::Hidden); + void sorted_byTime() + { QBENCHMARK { + QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); + testdir.setSorting(QDir::Time); + testdir.setFilter(QDir::AllEntries | QDir::System | QDir::Hidden); QStringList fileList = testdir.entryList(QDir::NoFilter, QDir::Time); foreach (const QString &filename, fileList) { Q_UNUSED(filename); @@ -155,7 +133,17 @@ private slots: } } - void sizeSpeedWithoutFilterLowLevel() { + void sorted_byName() + { + QBENCHMARK { + QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); + testdir.setFilter(QDir::AllEntries | QDir::System | QDir::Hidden); + [[maybe_unused]] auto r = testdir.entryInfoList(QDir::NoFilter, QDir::Name); + } + } + + void sizeSpeedWithoutFilterLowLevel() + { QDir testdir(QDir::tempPath() + QLatin1String("/test_speed")); #ifdef Q_OS_WIN const wchar_t *dirpath = (wchar_t*)testdir.absolutePath().utf16(); @@ -163,22 +151,22 @@ private slots: wcscpy(appendedPath, dirpath); wcscat(appendedPath, L"\\*"); - WIN32_FIND_DATA fd; - HANDLE hSearch = FindFirstFileW(appendedPath, &fd); - QVERIFY(hSearch != INVALID_HANDLE_VALUE); - QBENCHMARK { + WIN32_FIND_DATA fd; + HANDLE hSearch = FindFirstFileW(appendedPath, &fd); + QVERIFY(hSearch != INVALID_HANDLE_VALUE); + do { } while (FindNextFile(hSearch, &fd)); + FindClose(hSearch); } - FindClose(hSearch); #else - DIR *dir = opendir(qPrintable(testdir.absolutePath())); - QVERIFY(dir); - QVERIFY(!chdir(qPrintable(testdir.absolutePath()))); QBENCHMARK { + DIR *dir = opendir(qPrintable(testdir.absolutePath())); + QVERIFY(dir); + struct dirent *item = readdir(dir); while (item) { char *fileName = item->d_name; @@ -188,11 +176,12 @@ private slots: item = readdir(dir); } + closedir(dir); } - closedir(dir); #endif } }; -QTEST_MAIN(bench_QDir_10000) -#include "bench_qdir_10000.moc" +QTEST_MAIN(tst_QDir_10000) + +#include "tst_bench_qdir_10000.moc" diff --git a/tests/benchmarks/corelib/io/qdir/CMakeLists.txt b/tests/benchmarks/corelib/io/qdir/CMakeLists.txt index 10185014fa..00991de9a9 100644 --- a/tests/benchmarks/corelib/io/qdir/CMakeLists.txt +++ b/tests/benchmarks/corelib/io/qdir/CMakeLists.txt @@ -1,3 +1,4 @@ -# Generated from qdir.pro. - +# Copyright (C) 2024 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause add_subdirectory(10000) +add_subdirectory(tree) diff --git a/tests/benchmarks/corelib/io/qdir/tree/4.6.0-list.txt b/tests/benchmarks/corelib/io/qdir/tree/4.6.0-list.txt index ee5f7eabc1..6f1a208fe0 100644 --- a/tests/benchmarks/corelib/io/qdir/tree/4.6.0-list.txt +++ b/tests/benchmarks/corelib/io/qdir/tree/4.6.0-list.txt @@ -7983,8 +7983,6 @@ qeventloop.cpp qeventloop.h qfunctions_p.h - qfunctions_vxworks.cpp - qfunctions_vxworks.h qfunctions_wince.cpp qfunctions_wince.h qguard_p.h diff --git a/tests/benchmarks/corelib/io/qdir/tree/CMakeLists.txt b/tests/benchmarks/corelib/io/qdir/tree/CMakeLists.txt index c60bfcfdc3..f60c108480 100644 --- a/tests/benchmarks/corelib/io/qdir/tree/CMakeLists.txt +++ b/tests/benchmarks/corelib/io/qdir/tree/CMakeLists.txt @@ -1,28 +1,25 @@ -# Generated from tree.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### -## bench_qdir_tree Binary: +## tst_bench_qdir_tree Binary: ##################################################################### -qt_internal_add_benchmark(bench_qdir_tree +qt_internal_add_benchmark(tst_bench_qdir_tree SOURCES - bench_qdir_tree.cpp - PUBLIC_LIBRARIES + tst_bench_qdir_tree.cpp + LIBRARIES Qt::Test ) # Resources: -set(bench_qdir_tree_resource_files +set(qdir_tree_resource_files "4.6.0-list.txt" ) -qt_internal_add_resource(bench_qdir_tree "bench_qdir_tree" +qt_internal_add_resource(tst_bench_qdir_tree "tst_bench_qdir_tree" PREFIX "/" FILES - ${bench_qdir_tree_resource_files} + ${qdir_tree_resource_files} ) - - -#### Keys ignored in scope 1:.:.:tree.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/io/qdir/tree/bench_qdir_tree.cpp b/tests/benchmarks/corelib/io/qdir/tree/tst_bench_qdir_tree.cpp index 0abf8769a6..4f122c876c 100644 --- a/tests/benchmarks/corelib/io/qdir/tree/bench_qdir_tree.cpp +++ b/tests/benchmarks/corelib/io/qdir/tree/tst_bench_qdir_tree.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QtTest/QTest> @@ -35,14 +10,14 @@ #include "../../../../../shared/filesystem.h" -class bench_QDir_tree +class tst_QDir_tree : public QObject { Q_OBJECT public: - bench_QDir_tree() - : prefix("./test-tree/"), + tst_QDir_tree() + : prefix("test-tree/"), musicprefix(QLatin1String("music")), photoprefix(QLatin1String("photos")), sourceprefix(QLatin1String("source")), @@ -60,6 +35,7 @@ private: qint64 musicsize; qint64 photosize; qint64 sourcesize; + FileSystem fs; // Uses QTemporaryDir to tidy away file tree created. private slots: void initTestCase() @@ -71,7 +47,7 @@ private slots: QStack<QByteArray> stack; QByteArray line; - Q_FOREVER { + while (true) { char ch; if (!list.getChar(&ch)) break; @@ -89,12 +65,11 @@ private slots: --pop; } - line = list.readLine(); - line.chop(1); + line = list.readLine().trimmed(); stack.push(line); line = prefix; - Q_FOREACH(const QByteArray &pathElement, stack) + for (const QByteArray &pathElement : std::as_const(stack)) line += pathElement; if (line.endsWith('/')) @@ -140,13 +115,11 @@ private slots: QTest::addColumn<int>("filter"); QTest::addColumn<int>("entryCount"); - QTest::newRow("*.cpp") << QStringList("*.cpp") - << int(QDir::Files) - << 3813; - - QTest::newRow("executables") << QStringList("*") + QTest::newRow("*.cpp") << QStringList("*.cpp") << int(QDir::Files) << 3791; + QTest::newRow("executables") + << QStringList("*") << int(QDir::Executable | QDir::Files | QDir::AllDirs | QDir::NoDotAndDotDot) - << 543; + << 536; } void fileSearch() const @@ -158,8 +131,9 @@ private slots: int count = 0; QBENCHMARK { // Recursive directory iteration - QDirIterator iterator(prefix, nameFilters, QDir::Filter(filter), - QDirIterator::Subdirectories | QDirIterator::FollowSymlinks); + QDirIterator iterator(fs.absoluteFilePath(prefix), + nameFilters, QDir::Filter(filter), + QDirIterator::Subdirectories | QDirIterator::FollowSymlinks); count = 0; while (iterator.hasNext()) { @@ -177,7 +151,8 @@ private slots: { int count = 0; QBENCHMARK { - QDirIterator iterator(prefix, + QDirIterator iterator( + fs.absoluteFilePath(prefix), QDir::AllEntries | QDir::NoDotAndDotDot | QDir::Hidden | QDir::System, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks); @@ -187,10 +162,10 @@ private slots: ++count; } - QCOMPARE(count, 11963); + QCOMPARE(count, 11906); } - QCOMPARE(count, 11963); + QCOMPARE(count, 11906); } void thousandFiles_data() const @@ -209,19 +184,18 @@ private slots: QBENCHMARK { qint64 totalsize = 0; int count = 0; - QDirIterator iter(dirName, QDir::Files, QDirIterator::Subdirectories); + QDirIterator iter(fs.absoluteFilePath(dirName), + QDir::Files, QDirIterator::Subdirectories); while(iter.hasNext()) { - iter.next(); count++; - totalsize += iter.fileInfo().size(); + totalsize += iter.nextFileInfo().size(); } QCOMPARE(count, 1000); QCOMPARE(totalsize, expectedSize); } } -private: - FileSystem fs; }; -QTEST_MAIN(bench_QDir_tree) -#include "bench_qdir_tree.moc" +QTEST_MAIN(tst_QDir_tree) + +#include "tst_bench_qdir_tree.moc" diff --git a/tests/benchmarks/corelib/io/qdir/tree/bench_qdir_tree.qrc b/tests/benchmarks/corelib/io/qdir/tree/tst_bench_qdir_tree.qrc index d57cb6c368..d57cb6c368 100644 --- a/tests/benchmarks/corelib/io/qdir/tree/bench_qdir_tree.qrc +++ b/tests/benchmarks/corelib/io/qdir/tree/tst_bench_qdir_tree.qrc diff --git a/tests/benchmarks/corelib/io/qdiriterator/CMakeLists.txt b/tests/benchmarks/corelib/io/qdiriterator/CMakeLists.txt index 8ba331a113..6a4579d35d 100644 --- a/tests/benchmarks/corelib/io/qdiriterator/CMakeLists.txt +++ b/tests/benchmarks/corelib/io/qdiriterator/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qdiriterator.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qdiriterator Binary: @@ -6,9 +7,9 @@ qt_internal_add_benchmark(tst_bench_qdiriterator SOURCES - main.cpp + tst_bench_qdiriterator.cpp qfilesystemiterator.cpp qfilesystemiterator.h - PUBLIC_LIBRARIES + LIBRARIES Qt::Test ) diff --git a/tests/benchmarks/corelib/io/qdiriterator/qfilesystemiterator.cpp b/tests/benchmarks/corelib/io/qdiriterator/qfilesystemiterator.cpp index 10b1b90ce2..16b64cf362 100644 --- a/tests/benchmarks/corelib/io/qdiriterator/qfilesystemiterator.cpp +++ b/tests/benchmarks/corelib/io/qdiriterator/qfilesystemiterator.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only /*! \since 4.5 @@ -85,7 +60,7 @@ #include <qplatformdefs.h> #ifdef Q_OS_WIN -# include <windows.h> +# include <qt_windows.h> #else # include <sys/stat.h> # include <sys/types.h> diff --git a/tests/benchmarks/corelib/io/qdiriterator/qfilesystemiterator.h b/tests/benchmarks/corelib/io/qdiriterator/qfilesystemiterator.h index 26bd2f59d9..479ce7b392 100644 --- a/tests/benchmarks/corelib/io/qdiriterator/qfilesystemiterator.h +++ b/tests/benchmarks/corelib/io/qdiriterator/qfilesystemiterator.h @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #ifndef QFILESYSTEMITERATOR_H #define QFILESYSTEMITERATOR_H diff --git a/tests/benchmarks/corelib/io/qdiriterator/main.cpp b/tests/benchmarks/corelib/io/qdiriterator/tst_bench_qdiriterator.cpp index 367913338f..66448bf838 100644 --- a/tests/benchmarks/corelib/io/qdiriterator/main.cpp +++ b/tests/benchmarks/corelib/io/qdiriterator/tst_bench_qdiriterator.cpp @@ -1,32 +1,8 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QDebug> #include <QDirIterator> +#include <QDirListing> #include <QString> #include <qplatformdefs.h> @@ -48,40 +24,52 @@ #include <filesystem> #endif -class tst_qdiriterator : public QObject +using namespace Qt::StringLiterals; + +constexpr bool forceStat = false; + +class tst_QDirIterator : public QObject { Q_OBJECT void data(); + + const QDir::Filters dirFilters = + // QDir::AllEntries | QDir::Hidden | QDir::NoDotAndDotDot + QDir::AllEntries | QDir::Hidden + //QDir::Files | QDir::NoDotAndDotDot, + // QDir::Files, + ; + private slots: void posix(); void posix_data() { data(); } void diriterator(); void diriterator_data() { data(); } + void dirlisting(); + void dirlisting_data() { data(); } void fsiterator(); void fsiterator_data() { data(); } void stdRecursiveDirectoryIterator(); void stdRecursiveDirectoryIterator_data() { data(); } }; - -void tst_qdiriterator::data() +void tst_QDirIterator::data() { -#if defined(Q_OS_WIN) - const char *qtdir = "C:\\depot\\qt\\main"; -#else - const char *qtdir = ::getenv("QTDIR"); -#endif - if (!qtdir) { - fprintf(stderr, "QTDIR not set\n"); - exit(1); - } + const char hereRelative[] = "tests/benchmarks/corelib/io/qdiriterator"; + QByteArray dir(QT_TESTCASE_SOURCEDIR); + // qDebug("Source dir: %s", dir.constData()); + dir.chop(sizeof(hereRelative)); // Counts the '\0', making up for the omitted leading '/' + // qDebug("Root dir: %s", dir.constData()); QTest::addColumn<QByteArray>("dirpath"); - QByteArray ba = QByteArray(qtdir) + "/src/corelib"; - QByteArray ba1 = ba + "/io"; - QTest::newRow(ba) << ba; - //QTest::newRow(ba1) << ba1; + const QByteArray ba = dir + "/src/corelib"; + + if (!QFileInfo(QString::fromLocal8Bit(ba)).isDir()) + QSKIP("Missing Qt directory"); + + QTest::newRow("corelib") << ba; + QTest::newRow("corelib/io") << (ba + "/io"); } #ifdef Q_OS_WIN @@ -145,9 +133,20 @@ static int posix_helper(const char *dirpath) QByteArray ba = dirpath; ba += '/'; ba += entry->d_name; + bool isDir = false; +#if defined(_DIRENT_HAVE_D_TYPE) || defined(Q_OS_BSD4) + isDir = entry->d_type == DT_DIR; + if (forceStat) { + QT_STATBUF st; + QT_LSTAT(ba.constData(), &st); + } +#else // d_type not available >>> must stat() to see if it's a dir QT_STATBUF st; QT_LSTAT(ba.constData(), &st); - if (S_ISDIR(st.st_mode)) + isDir = S_ISDIR(st.st_mode); +#endif + + if (isDir) count += posix_helper(ba.constData()); } @@ -157,7 +156,7 @@ static int posix_helper(const char *dirpath) #endif -void tst_qdiriterator::posix() +void tst_QDirIterator::posix() { QFETCH(QByteArray, dirpath); @@ -175,7 +174,7 @@ void tst_qdiriterator::posix() qDebug() << count; } -void tst_qdiriterator::diriterator() +void tst_QDirIterator::diriterator() { QFETCH(QByteArray, dirpath); @@ -184,20 +183,40 @@ void tst_qdiriterator::diriterator() QBENCHMARK { int c = 0; - QDirIterator dir(dirpath, - //QDir::AllEntries | QDir::Hidden | QDir::NoDotAndDotDot, - //QDir::AllEntries | QDir::Hidden, - QDir::Files, - QDirIterator::Subdirectories); + QDirIterator dir(dirpath, dirFilters, QDirIterator::Subdirectories); while (dir.hasNext()) { - dir.next(); + const auto fi = dir.nextFileInfo(); + if (forceStat) + fi.size(); //printf("%s\n", qPrintable(dir.fileName())); 0 && printf("%d %s\n", - dir.fileInfo().isDir(), - //qPrintable(dir.fileInfo().absoluteFilePath()), + fi.isDir(), + //qPrintable(fi.absoluteFilePath()), //qPrintable(dir.path()), - qPrintable(dir.filePath())); + qPrintable(fi.filePath())); + ++c; + } + count = c; + } + qDebug() << count; +} + +void tst_QDirIterator::dirlisting() +{ + QFETCH(QByteArray, dirpath); + + int count = 0; + + QBENCHMARK { + int c = 0; + + QDirListing dir(dirpath, dirFilters, QDirListing::IteratorFlag::Recursive); + + for (const auto &dirEntry : dir) { + const auto path = dirEntry.filePath(); + if (forceStat) + dirEntry.size(); ++c; } count = c; @@ -205,7 +224,7 @@ void tst_qdiriterator::diriterator() qDebug() << count; } -void tst_qdiriterator::fsiterator() +void tst_QDirIterator::fsiterator() { QFETCH(QByteArray, dirpath); @@ -216,14 +235,12 @@ void tst_qdiriterator::fsiterator() int c = 0; dump && printf("\n\n\n\n"); - QDirIteratorTest::QFileSystemIterator dir(dirpath, - //QDir::AllEntries | QDir::Hidden | QDir::NoDotAndDotDot, - //QDir::AllEntries | QDir::Hidden, - //QDir::Files | QDir::NoDotAndDotDot, - QDir::Files, - QDirIteratorTest::QFileSystemIterator::Subdirectories); + QDirIteratorTest::QFileSystemIterator dir( + dirpath, dirFilters, QDirIteratorTest::QFileSystemIterator::Subdirectories); for (; !dir.atEnd(); dir.next()) { + if (forceStat) + dir.fileInfo().size(); dump && printf("%d %s\n", dir.fileInfo().isDir(), //qPrintable(dir.fileInfo().absoluteFilePath()), @@ -237,17 +254,23 @@ void tst_qdiriterator::fsiterator() qDebug() << count; } -void tst_qdiriterator::stdRecursiveDirectoryIterator() +void tst_QDirIterator::stdRecursiveDirectoryIterator() { #if QT_CONFIG(cxx17_filesystem) QFETCH(QByteArray, dirpath); int count = 0; + namespace fs = std::filesystem; + std::error_code ec; + + // Note that fs::recursive_directory_iterator may be calling stat() internally, + // that depends on the implementation. So the benchmark times might "seem" higher + // than the other methods in this source file. QBENCHMARK { int c = 0; - for (auto obj : std::filesystem::recursive_directory_iterator(dirpath.data())) { - if (obj.is_directory()) + for (const auto &dirEntry : fs::recursive_directory_iterator(dirpath.data(), ec)) { + if (dirEntry.is_directory()) continue; c++; } @@ -259,6 +282,6 @@ void tst_qdiriterator::stdRecursiveDirectoryIterator() #endif } -QTEST_MAIN(tst_qdiriterator) +QTEST_MAIN(tst_QDirIterator) -#include "main.moc" +#include "tst_bench_qdiriterator.moc" diff --git a/tests/benchmarks/corelib/io/qfile/CMakeLists.txt b/tests/benchmarks/corelib/io/qfile/CMakeLists.txt index 6ae5029a8a..0cd6b5fb16 100644 --- a/tests/benchmarks/corelib/io/qfile/CMakeLists.txt +++ b/tests/benchmarks/corelib/io/qfile/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qfile.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qfile Binary: @@ -6,15 +7,12 @@ qt_internal_add_benchmark(tst_bench_qfile SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qfile.cpp + LIBRARIES Qt::CorePrivate Qt::Test ) -#### Keys ignored in scope 1:.:.:qfile.pro:<TRUE>: -# TEMPLATE = "app" - ## Scopes: ##################################################################### diff --git a/tests/benchmarks/corelib/io/qfile/main.cpp b/tests/benchmarks/corelib/io/qfile/main.cpp deleted file mode 100644 index 73b3ba8c48..0000000000 --- a/tests/benchmarks/corelib/io/qfile/main.cpp +++ /dev/null @@ -1,707 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QDebug> -#include <QTemporaryFile> -#include <QString> -#include <QDirIterator> - -#include <private/qfsfileengine_p.h> - -#include <qtest.h> - -#include <stdio.h> - -#ifdef Q_OS_WIN -# include <windows.h> -#endif - -#if defined(Q_OS_QNX) && defined(open) -#undef open -#endif - -#define BUFSIZE 1024*512 -#define FACTOR 1024*512 -#define TF_SIZE FACTOR*81 - -// 10 predefined (but random() seek positions -// hardcoded to be comparable over several runs -const int seekpos[] = {int(TF_SIZE*0.52), - int(TF_SIZE*0.23), - int(TF_SIZE*0.73), - int(TF_SIZE*0.77), - int(TF_SIZE*0.80), - int(TF_SIZE*0.12), - int(TF_SIZE*0.53), - int(TF_SIZE*0.21), - int(TF_SIZE*0.27), - int(TF_SIZE*0.78)}; - -const int sp_size = sizeof(seekpos)/sizeof(int); - -class tst_qfile: public QObject -{ -Q_ENUMS(BenchmarkType) -Q_OBJECT -public: - enum BenchmarkType { - QFileBenchmark = 1, -#ifdef QT_BUILD_INTERNAL - QFSFileEngineBenchmark, -#endif - Win32Benchmark, - PosixBenchmark, - QFileFromPosixBenchmark - }; -private slots: - void initTestCase(); - void cleanupTestCase(); - - void open_data(); - void open(); - void seek_data(); - void seek(); - - void readSmallFiles_QFile(); - void readSmallFiles_QFSFileEngine(); - void readSmallFiles_posix(); - void readSmallFiles_Win32(); - - void readSmallFiles_QFile_data(); - void readSmallFiles_QFSFileEngine_data(); - void readSmallFiles_posix_data(); - void readSmallFiles_Win32_data(); - - void readBigFile_QFile_data(); - void readBigFile_QFSFileEngine_data(); - void readBigFile_posix_data(); - void readBigFile_Win32_data(); - - void readBigFile_QFile(); - void readBigFile_QFSFileEngine(); - void readBigFile_posix(); - void readBigFile_Win32(); - -private: - void readBigFile_data(BenchmarkType type, QIODevice::OpenModeFlag t, QIODevice::OpenModeFlag b); - void readBigFile(); - void readSmallFiles_data(BenchmarkType type, QIODevice::OpenModeFlag t, QIODevice::OpenModeFlag b); - void readSmallFiles(); - void createFile(); - void fillFile(int factor=FACTOR); - void removeFile(); - void createSmallFiles(); - void removeSmallFiles(); - QString filename; - QString tmpDirName; -}; - -Q_DECLARE_METATYPE(tst_qfile::BenchmarkType) -Q_DECLARE_METATYPE(QIODevice::OpenMode) -Q_DECLARE_METATYPE(QIODevice::OpenModeFlag) - -void tst_qfile::createFile() -{ - removeFile(); // Cleanup in case previous test case aborted before cleaning up - - QTemporaryFile tmpFile; - tmpFile.setAutoRemove(false); - if (!tmpFile.open()) - ::exit(1); - filename = tmpFile.fileName(); - tmpFile.close(); -} - -void tst_qfile::removeFile() -{ - if (!filename.isEmpty()) - QFile::remove(filename); -} - -void tst_qfile::fillFile(int factor) -{ - QFile tmpFile(filename); - tmpFile.open(QIODevice::WriteOnly); - //for (int row=0; row<factor; ++row) { - // tmpFile.write(QByteArray().fill('0'+row%('0'-'z'), 80)); - // tmpFile.write("\n"); - //} - tmpFile.seek(factor*80); - tmpFile.putChar('\n'); - tmpFile.close(); - // let IO settle - QTest::qSleep(2000); -} - -void tst_qfile::initTestCase() -{ -} - -void tst_qfile::cleanupTestCase() -{ -} - -void tst_qfile::readBigFile_QFile() { readBigFile(); } -void tst_qfile::readBigFile_QFSFileEngine() -{ -#ifdef QT_BUILD_INTERNAL - readBigFile(); -#else - QSKIP("This test requires -developer-build."); -#endif -} -void tst_qfile::readBigFile_posix() -{ - readBigFile(); -} -void tst_qfile::readBigFile_Win32() { readBigFile(); } - -void tst_qfile::readBigFile_QFile_data() -{ - readBigFile_data(QFileBenchmark, QIODevice::NotOpen, QIODevice::NotOpen); - readBigFile_data(QFileBenchmark, QIODevice::NotOpen, QIODevice::Unbuffered); - readBigFile_data(QFileBenchmark, QIODevice::Text, QIODevice::NotOpen); - readBigFile_data(QFileBenchmark, QIODevice::Text, QIODevice::Unbuffered); - -} - -void tst_qfile::readBigFile_QFSFileEngine_data() -{ -#ifdef QT_BUILD_INTERNAL - readBigFile_data(QFSFileEngineBenchmark, QIODevice::NotOpen, QIODevice::NotOpen); - readBigFile_data(QFSFileEngineBenchmark, QIODevice::NotOpen, QIODevice::Unbuffered); - readBigFile_data(QFSFileEngineBenchmark, QIODevice::Text, QIODevice::NotOpen); - readBigFile_data(QFSFileEngineBenchmark, QIODevice::Text, QIODevice::Unbuffered); -#else - QTest::addColumn<int>("dummy"); - QTest::newRow("Test will be skipped") << -1; -#endif -} - -void tst_qfile::readBigFile_posix_data() -{ - readBigFile_data(PosixBenchmark, QIODevice::NotOpen, QIODevice::NotOpen); -} - -void tst_qfile::readBigFile_Win32_data() -{ - readBigFile_data(Win32Benchmark, QIODevice::NotOpen, QIODevice::NotOpen); -} - - -void tst_qfile::readBigFile_data(BenchmarkType type, QIODevice::OpenModeFlag t, QIODevice::OpenModeFlag b) -{ - QTest::addColumn<tst_qfile::BenchmarkType>("testType"); - QTest::addColumn<int>("blockSize"); - QTest::addColumn<QFile::OpenModeFlag>("textMode"); - QTest::addColumn<QFile::OpenModeFlag>("bufferedMode"); - - const int bs[] = {1024, 1024*2, 1024*8, 1024*16, 1024*32,1024*512}; - int bs_entries = sizeof(bs)/sizeof(const int); - - QString flagstring; - if (t & QIODevice::Text) flagstring += "textMode "; - if (b & QIODevice::Unbuffered) flagstring += "unbuffered "; - if (flagstring.isEmpty()) flagstring = "none"; - - for (int i=0; i<bs_entries; ++i) - QTest::newRow((QString("BS: %1, Flags: %2" )).arg(bs[i]).arg(flagstring).toLatin1().constData()) << type << bs[i] << t << b; -} - -void tst_qfile::readBigFile() -{ - QFETCH(tst_qfile::BenchmarkType, testType); - QFETCH(int, blockSize); - QFETCH(QFile::OpenModeFlag, textMode); - QFETCH(QFile::OpenModeFlag, bufferedMode); - -#ifndef Q_OS_WIN - if (testType == Win32Benchmark) - QSKIP("This is Windows only benchmark."); -#endif - - char *buffer = new char[BUFSIZE]; - createFile(); - fillFile(); - - switch (testType) { - case(QFileBenchmark): { - QFile file(filename); - file.open(QIODevice::ReadOnly|textMode|bufferedMode); - QBENCHMARK { - while(!file.atEnd()) - file.read(blockSize); - file.reset(); - } - file.close(); - } - break; -#ifdef QT_BUILD_INTERNAL - case(QFSFileEngineBenchmark): { - QFSFileEngine fse(filename); - fse.open(QIODevice::ReadOnly|textMode|bufferedMode); - QBENCHMARK { - //qWarning() << fse.supportsExtension(QAbstractFileEngine::AtEndExtension); - while(fse.read(buffer, blockSize)); - fse.seek(0); - } - fse.close(); - } - break; -#endif - case(PosixBenchmark): { - QByteArray data = filename.toLocal8Bit(); - const char* cfilename = data.constData(); - FILE* cfile = ::fopen(cfilename, "rb"); - QBENCHMARK { - while(!feof(cfile)) - ::fread(buffer, blockSize, 1, cfile); - ::fseek(cfile, 0, SEEK_SET); - } - ::fclose(cfile); - } - break; - case(QFileFromPosixBenchmark): { - // No gain in benchmarking this case - } - break; - case(Win32Benchmark): { -#ifdef Q_OS_WIN - HANDLE hndl; - - // ensure we don't account string conversion - wchar_t* cfilename = (wchar_t*)filename.utf16(); - - hndl = CreateFile(cfilename, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0); - Q_ASSERT(hndl); - wchar_t* nativeBuffer = new wchar_t[BUFSIZE]; - DWORD numberOfBytesRead; - - QBENCHMARK { - do { - ReadFile(hndl, nativeBuffer, blockSize, &numberOfBytesRead, NULL); - } while(numberOfBytesRead != 0); - SetFilePointer(hndl, 0, NULL, FILE_BEGIN); - } - delete[] nativeBuffer; - CloseHandle(hndl); -#else - QFAIL("Not running on a non-Windows platform!"); -#endif - } - break; - } - - removeFile(); - delete[] buffer; -} - -void tst_qfile::seek_data() -{ - QTest::addColumn<tst_qfile::BenchmarkType>("testType"); - QTest::newRow("QFile") << QFileBenchmark; -#ifdef QT_BUILD_INTERNAL - QTest::newRow("QFSFileEngine") << QFSFileEngineBenchmark; -#endif - QTest::newRow("Posix FILE*") << PosixBenchmark; -#ifdef Q_OS_WIN - QTest::newRow("Win32 API") << Win32Benchmark; -#endif -} - -void tst_qfile::seek() -{ - QFETCH(tst_qfile::BenchmarkType, testType); - int i = 0; - - createFile(); - fillFile(); - - switch (testType) { - case(QFileBenchmark): { - QFile file(filename); - file.open(QIODevice::ReadOnly); - QBENCHMARK { - i=(i+1)%sp_size; - file.seek(seekpos[i]); - } - file.close(); - } - break; -#ifdef QT_BUILD_INTERNAL - case(QFSFileEngineBenchmark): { - QFSFileEngine fse(filename); - fse.open(QIODevice::ReadOnly); - QBENCHMARK { - i=(i+1)%sp_size; - fse.seek(seekpos[i]); - } - fse.close(); - } - break; -#endif - case(PosixBenchmark): { - QByteArray data = filename.toLocal8Bit(); - const char* cfilename = data.constData(); - FILE* cfile = ::fopen(cfilename, "rb"); - QBENCHMARK { - i=(i+1)%sp_size; - ::fseek(cfile, seekpos[i], SEEK_SET); - } - ::fclose(cfile); - } - break; - case(QFileFromPosixBenchmark): { - // No gain in benchmarking this case - } - break; - case(Win32Benchmark): { -#ifdef Q_OS_WIN - HANDLE hndl; - - // ensure we don't account string conversion - wchar_t* cfilename = (wchar_t*)filename.utf16(); - - hndl = CreateFile(cfilename, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0); - Q_ASSERT(hndl); - QBENCHMARK { - i=(i+1)%sp_size; - SetFilePointer(hndl, seekpos[i], NULL, 0); - } - CloseHandle(hndl); -#else - QFAIL("Not running on a Windows plattform!"); -#endif - } - break; - } - - removeFile(); -} - -void tst_qfile::open_data() -{ - QTest::addColumn<tst_qfile::BenchmarkType>("testType"); - QTest::newRow("QFile") << QFileBenchmark; -#ifdef QT_BUILD_INTERNAL - QTest::newRow("QFSFileEngine") << QFSFileEngineBenchmark; -#endif - QTest::newRow("Posix FILE*") << PosixBenchmark; - QTest::newRow("QFile from FILE*") << QFileFromPosixBenchmark; -#ifdef Q_OS_WIN - QTest::newRow("Win32 API") << Win32Benchmark; -#endif -} - -void tst_qfile::open() -{ - QFETCH(tst_qfile::BenchmarkType, testType); - - createFile(); - - switch (testType) { - case(QFileBenchmark): { - QBENCHMARK { - QFile file( filename ); - file.open( QIODevice::ReadOnly ); - file.close(); - } - } - break; -#ifdef QT_BUILD_INTERNAL - case(QFSFileEngineBenchmark): { - QBENCHMARK { - QFSFileEngine fse(filename); - fse.open(QIODevice::ReadOnly); - fse.close(); - } - } - break; -#endif - case(PosixBenchmark): { - // ensure we don't account toLocal8Bit() - QByteArray data = filename.toLocal8Bit(); - const char* cfilename = data.constData(); - - QBENCHMARK { - FILE* cfile = ::fopen(cfilename, "rb"); - ::fclose(cfile); - } - } - break; - case(QFileFromPosixBenchmark): { - // ensure we don't account toLocal8Bit() - QByteArray data = filename.toLocal8Bit(); - const char* cfilename = data.constData(); - FILE* cfile = ::fopen(cfilename, "rb"); - - QBENCHMARK { - QFile file; - file.open(cfile, QIODevice::ReadOnly); - file.close(); - } - ::fclose(cfile); - } - break; - case(Win32Benchmark): { -#ifdef Q_OS_WIN - HANDLE hndl; - - // ensure we don't account string conversion - wchar_t* cfilename = (wchar_t*)filename.utf16(); - - QBENCHMARK { - hndl = CreateFile(cfilename, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0); - Q_ASSERT(hndl); - CloseHandle(hndl); - } -#else - QFAIL("Not running on a non-Windows platform!"); -#endif - } - break; - } - - removeFile(); -} - - -void tst_qfile::readSmallFiles_QFile() { readSmallFiles(); } -void tst_qfile::readSmallFiles_QFSFileEngine() -{ -#ifdef QT_BUILD_INTERNAL - readSmallFiles(); -#else - QSKIP("This test requires -developer-build."); -#endif -} -void tst_qfile::readSmallFiles_posix() -{ - readSmallFiles(); -} -void tst_qfile::readSmallFiles_Win32() -{ - readSmallFiles(); -} - -void tst_qfile::readSmallFiles_QFile_data() -{ - readSmallFiles_data(QFileBenchmark, QIODevice::NotOpen, QIODevice::NotOpen); - readSmallFiles_data(QFileBenchmark, QIODevice::NotOpen, QIODevice::Unbuffered); - readSmallFiles_data(QFileBenchmark, QIODevice::Text, QIODevice::NotOpen); - readSmallFiles_data(QFileBenchmark, QIODevice::Text, QIODevice::Unbuffered); - -} - -void tst_qfile::readSmallFiles_QFSFileEngine_data() -{ -#ifdef QT_BUILD_INTERNAL - readSmallFiles_data(QFSFileEngineBenchmark, QIODevice::NotOpen, QIODevice::NotOpen); - readSmallFiles_data(QFSFileEngineBenchmark, QIODevice::NotOpen, QIODevice::Unbuffered); - readSmallFiles_data(QFSFileEngineBenchmark, QIODevice::Text, QIODevice::NotOpen); - readSmallFiles_data(QFSFileEngineBenchmark, QIODevice::Text, QIODevice::Unbuffered); -#else - QTest::addColumn<int>("dummy"); - QTest::newRow("Test will be skipped") << -1; -#endif -} - -void tst_qfile::readSmallFiles_posix_data() -{ - readSmallFiles_data(PosixBenchmark, QIODevice::NotOpen, QIODevice::NotOpen); -} - -void tst_qfile::readSmallFiles_Win32_data() -{ - readSmallFiles_data(Win32Benchmark, QIODevice::NotOpen, QIODevice::NotOpen); -} - - -void tst_qfile::readSmallFiles_data(BenchmarkType type, QIODevice::OpenModeFlag t, QIODevice::OpenModeFlag b) -{ - QTest::addColumn<tst_qfile::BenchmarkType>("testType"); - QTest::addColumn<int>("blockSize"); - QTest::addColumn<QFile::OpenModeFlag>("textMode"); - QTest::addColumn<QFile::OpenModeFlag>("bufferedMode"); - - const int bs[] = {1024, 1024*2, 1024*8, 1024*16, 1024*32,1024*512}; - int bs_entries = sizeof(bs)/sizeof(const int); - - QString flagstring; - if (t & QIODevice::Text) flagstring += "textMode "; - if (b & QIODevice::Unbuffered) flagstring += "unbuffered "; - if (flagstring.isEmpty()) flagstring = "none"; - - for (int i=0; i<bs_entries; ++i) - QTest::newRow((QString("BS: %1, Flags: %2" )).arg(bs[i]).arg(flagstring).toLatin1().constData()) << type << bs[i] << t << b; - -} - -void tst_qfile::createSmallFiles() -{ - QDir dir = QDir::temp(); - dir.mkdir("tst"); - dir.cd("tst"); - tmpDirName = dir.absolutePath(); - - for (int i = 0; i < 1000; ++i) { - QFile f(tmpDirName + QLatin1Char('/') + QString::number(i)); - f.open(QIODevice::WriteOnly); - f.seek(511); - f.putChar('\n'); - f.close(); - } -} - -void tst_qfile::removeSmallFiles() -{ - QDirIterator it(tmpDirName, QDirIterator::FollowSymlinks); - while (it.hasNext()) - QFile::remove(it.next()); - QDir::temp().rmdir("tst"); -} - - -void tst_qfile::readSmallFiles() -{ - QFETCH(tst_qfile::BenchmarkType, testType); - QFETCH(int, blockSize); - QFETCH(QFile::OpenModeFlag, textMode); - QFETCH(QFile::OpenModeFlag, bufferedMode); - -#ifndef Q_OS_WIN - if (testType == Win32Benchmark) - QSKIP("This is Windows only benchmark."); -#endif - - createSmallFiles(); - - QDir dir(tmpDirName); - const QStringList files = dir.entryList(QDir::NoDotAndDotDot|QDir::NoSymLinks|QDir::Files); - char *buffer = new char[BUFSIZE]; - - switch (testType) { - case(QFileBenchmark): { - QList<QFile*> fileList; - Q_FOREACH(QString file, files) { - QFile *f = new QFile(tmpDirName + QLatin1Char('/') + file); - f->open(QIODevice::ReadOnly|textMode|bufferedMode); - fileList.append(f); - } - - QBENCHMARK { - Q_FOREACH(QFile *file, fileList) { - while (!file->atEnd()) { - file->read(buffer, blockSize); - } - } - } - - Q_FOREACH(QFile *file, fileList) { - file->close(); - delete file; - } - } - break; -#ifdef QT_BUILD_INTERNAL - case(QFSFileEngineBenchmark): { - QList<QFSFileEngine*> fileList; - Q_FOREACH(QString file, files) { - QFSFileEngine *fse = new QFSFileEngine(tmpDirName + QLatin1Char('/') + file); - fse->open(QIODevice::ReadOnly|textMode|bufferedMode); - fileList.append(fse); - } - - QBENCHMARK { - Q_FOREACH(QFSFileEngine *fse, fileList) { - while (fse->read(buffer, blockSize)); - } - } - - Q_FOREACH(QFSFileEngine *fse, fileList) { - fse->close(); - delete fse; - } - } - break; -#endif - case(PosixBenchmark): { - QList<FILE*> fileList; - Q_FOREACH(QString file, files) { - fileList.append(::fopen(QFile::encodeName(tmpDirName + QLatin1Char('/') + file).constData(), "rb")); - } - - QBENCHMARK { - Q_FOREACH(FILE* cfile, fileList) { - while(!feof(cfile)) - ::fread(buffer, blockSize, 1, cfile); - ::fseek(cfile, 0, SEEK_SET); - } - } - - Q_FOREACH(FILE* cfile, fileList) { - ::fclose(cfile); - } - } - break; - case(QFileFromPosixBenchmark): { - // No gain in benchmarking this case - } - break; - case(Win32Benchmark): { -#ifdef Q_OS_WIN - HANDLE hndl; - - // ensure we don't account string conversion - wchar_t* cfilename = (wchar_t*)filename.utf16(); - - hndl = CreateFile(cfilename, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0); - Q_ASSERT(hndl); - wchar_t* nativeBuffer = new wchar_t[BUFSIZE]; - DWORD numberOfBytesRead; - QBENCHMARK { - do { - ReadFile(hndl, nativeBuffer, blockSize, &numberOfBytesRead, NULL); - } while(numberOfBytesRead != 0); - } - delete nativeBuffer; - CloseHandle(hndl); -#else - QFAIL("Not running on a non-Windows platform!"); -#endif - } - break; - } - - removeSmallFiles(); - delete[] buffer; -} - -QTEST_MAIN(tst_qfile) - -#include "main.moc" diff --git a/tests/benchmarks/corelib/io/qfile/tst_bench_qfile.cpp b/tests/benchmarks/corelib/io/qfile/tst_bench_qfile.cpp new file mode 100644 index 0000000000..b805726f5f --- /dev/null +++ b/tests/benchmarks/corelib/io/qfile/tst_bench_qfile.cpp @@ -0,0 +1,593 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QDebug> +#include <QTemporaryFile> +#include <QString> +#include <QDirIterator> + +#include <private/qfsfileengine_p.h> + +#include <qtest.h> + +#include <stdio.h> + +#ifdef Q_OS_WIN +# include <qt_windows.h> +#endif + +#if defined(Q_OS_QNX) && defined(open) +#undef open +#endif + +#define BUFSIZE 1024*512 +#define FACTOR 1024*512 +#define TF_SIZE FACTOR*81 + +// 10 predefined (but random() seek positions +// hardcoded to be comparable over several runs +const int seekpos[] = {int(TF_SIZE*0.52), + int(TF_SIZE*0.23), + int(TF_SIZE*0.73), + int(TF_SIZE*0.77), + int(TF_SIZE*0.80), + int(TF_SIZE*0.12), + int(TF_SIZE*0.53), + int(TF_SIZE*0.21), + int(TF_SIZE*0.27), + int(TF_SIZE*0.78)}; + +const int sp_size = sizeof(seekpos)/sizeof(int); + +class tst_qfile: public QObject +{ +Q_ENUMS(BenchmarkType) +Q_OBJECT +public: + enum BenchmarkType { + QFileBenchmark = 1, +#ifdef QT_BUILD_INTERNAL + QFSFileEngineBenchmark, +#endif + Win32Benchmark, + PosixBenchmark, + QFileFromPosixBenchmark + }; +private slots: + void initTestCase(); + + void open_data(); + void open(); + void seek_data(); + void seek(); + + void readSmallFiles_QFile() { readSmallFiles(); } + void readSmallFiles_QFSFileEngine() { readSmallFiles(); } + void readSmallFiles_posix() { readSmallFiles(); } + void readSmallFiles_Win32() { readSmallFiles(); } + + void readSmallFiles_QFile_data(); + void readSmallFiles_QFSFileEngine_data(); + void readSmallFiles_posix_data(); + void readSmallFiles_Win32_data(); + + void readBigFile_QFile_data(); + void readBigFile_QFSFileEngine_data(); + void readBigFile_posix_data(); + void readBigFile_Win32_data(); + + void readBigFile_QFile() { readBigFile(); } + void readBigFile_QFSFileEngine() { readBigFile(); } + void readBigFile_posix() { readBigFile(); } + void readBigFile_Win32() { readBigFile(); } + +private: + void readFile_data(BenchmarkType type, QIODevice::OpenModeFlag t, QIODevice::OpenModeFlag b); + void readBigFile(); + void readSmallFiles(); + + class TestDataDir : public QTemporaryDir + { + void createFile(); + void createSmallFiles(); + public: + TestDataDir() : QTemporaryDir(), fail(errorString().toLocal8Bit()) + { + if (fail.isEmpty() && !QTemporaryDir::isValid()) + fail = "Failed to create temporary directory for data"; + if (isValid()) + createSmallFiles(); + if (isValid()) + createFile(); + if (isValid()) + QTest::qSleep(2000); // let IO settle + } + bool isValid() { return QTemporaryDir::isValid() && fail.isEmpty(); } + QByteArray fail; + QString filename; + } tempDir; +}; + +Q_DECLARE_METATYPE(tst_qfile::BenchmarkType) +Q_DECLARE_METATYPE(QIODevice::OpenMode) +Q_DECLARE_METATYPE(QIODevice::OpenModeFlag) + +/* None of the tests modify the test data in tempDir, so it's OK to only create + * and tear down the directory once. + */ +void tst_qfile::TestDataDir::createFile() +{ + QFile tmpFile(filePath("testFile")); + if (!tmpFile.open(QIODevice::WriteOnly)) { + fail = "Unable to prepare files for test"; + return; + } +#if 0 // Varied data, rather than filling with '\0' bytes: + for (int row = 0; row < FACTOR; ++row) { + tmpFile.write(QByteArray().fill('0' + row % ('0' - 'z'), 80)); + tmpFile.write("\n"); + } +#else + tmpFile.seek(FACTOR * 80); + tmpFile.putChar('\n'); +#endif + filename = tmpFile.fileName(); + tmpFile.close(); +} + +void tst_qfile::TestDataDir::createSmallFiles() +{ + for (int i = 0; i < 1000; ++i) { + QFile f(filePath(QString::number(i))); + if (!f.open(QIODevice::WriteOnly)) { + fail = "Unable to prepare small files for test"; + return; + } + f.seek(511); + f.putChar('\n'); + f.close(); + } +} + +void tst_qfile::initTestCase() +{ + QVERIFY2(tempDir.isValid(), tempDir.fail.constData()); +} + +void tst_qfile::readFile_data(BenchmarkType type, QIODevice::OpenModeFlag t, + QIODevice::OpenModeFlag b) +{ + QTest::addColumn<tst_qfile::BenchmarkType>("testType"); + QTest::addColumn<int>("blockSize"); + QTest::addColumn<QFile::OpenModeFlag>("textMode"); + QTest::addColumn<QFile::OpenModeFlag>("bufferedMode"); + + QByteArray flagstring; + if (t & QIODevice::Text) + flagstring += "textMode"; + if (b & QIODevice::Unbuffered) { + if (flagstring.size()) + flagstring += ' '; + flagstring += "unbuffered"; + } + if (flagstring.isEmpty()) + flagstring = "none"; + + const int kbs[] = {1, 2, 8, 16, 32, 512}; + for (int kb : kbs) { + const int size = 1024 * kb; + QTest::addRow("BS: %d, Flags: %s", size, flagstring.constData()) + << type << size << t << b; + } +} + +void tst_qfile::readBigFile_QFile_data() +{ + readFile_data(QFileBenchmark, QIODevice::NotOpen, QIODevice::NotOpen); + readFile_data(QFileBenchmark, QIODevice::NotOpen, QIODevice::Unbuffered); + readFile_data(QFileBenchmark, QIODevice::Text, QIODevice::NotOpen); + readFile_data(QFileBenchmark, QIODevice::Text, QIODevice::Unbuffered); + +} + +void tst_qfile::readBigFile_QFSFileEngine_data() +{ +#ifdef QT_BUILD_INTERNAL + // Support for buffering dropped at 5.10, so only test Unbuffered + readFile_data(QFSFileEngineBenchmark, QIODevice::NotOpen, QIODevice::Unbuffered); + readFile_data(QFSFileEngineBenchmark, QIODevice::Text, QIODevice::Unbuffered); +#else + QSKIP("This test requires -developer-build."); +#endif +} + +void tst_qfile::readBigFile_posix_data() +{ + readFile_data(PosixBenchmark, QIODevice::NotOpen, QIODevice::NotOpen); +} + +void tst_qfile::readBigFile_Win32_data() +{ +#ifdef Q_OS_WIN + readFile_data(Win32Benchmark, QIODevice::NotOpen, QIODevice::NotOpen); +#else + QSKIP("This is Windows only benchmark."); +#endif +} + +void tst_qfile::readBigFile() +{ + QFETCH(tst_qfile::BenchmarkType, testType); + QFETCH(int, blockSize); + QFETCH(QFile::OpenModeFlag, textMode); + QFETCH(QFile::OpenModeFlag, bufferedMode); + + char buffer[BUFSIZE]; + switch (testType) { + case QFileBenchmark: { + QFile file(tempDir.filename); + file.open(QIODevice::ReadOnly|textMode|bufferedMode); + QBENCHMARK { + while(!file.atEnd()) + file.read(blockSize); + file.reset(); + } + file.close(); + } + break; +#ifdef QT_BUILD_INTERNAL + case QFSFileEngineBenchmark: { + QFSFileEngine fse(tempDir.filename); + fse.open(QIODevice::ReadOnly | textMode | bufferedMode, std::nullopt); + QBENCHMARK { + //qWarning() << fse.supportsExtension(QAbstractFileEngine::AtEndExtension); + while (fse.read(buffer, blockSize)) {} + fse.seek(0); + } + fse.close(); + } + break; +#endif + case PosixBenchmark: { + QByteArray data = tempDir.filename.toLocal8Bit(); + const char* cfilename = data.constData(); + FILE* cfile = ::fopen(cfilename, "rb"); + QBENCHMARK { + while(!feof(cfile)) + [[maybe_unused]] auto r = ::fread(buffer, blockSize, 1, cfile); + ::fseek(cfile, 0, SEEK_SET); + } + ::fclose(cfile); + } + break; + case QFileFromPosixBenchmark: { + // No gain in benchmarking this case + } + break; + case Win32Benchmark: { +#ifdef Q_OS_WIN + HANDLE hndl; + + // ensure we don't account string conversion + const wchar_t *cfilename = reinterpret_cast<const wchar_t *>(tempDir.filename.utf16()); + + hndl = CreateFile(cfilename, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0); + Q_ASSERT(hndl); + wchar_t* nativeBuffer = new wchar_t[BUFSIZE]; + DWORD numberOfBytesRead; + + QBENCHMARK { + do { + ReadFile(hndl, nativeBuffer, blockSize, &numberOfBytesRead, NULL); + } while(numberOfBytesRead != 0); + SetFilePointer(hndl, 0, NULL, FILE_BEGIN); + } + delete[] nativeBuffer; + CloseHandle(hndl); +#else + QFAIL("Not running on a non-Windows platform!"); +#endif + } + break; + } +} + +void tst_qfile::seek_data() +{ + QTest::addColumn<tst_qfile::BenchmarkType>("testType"); + QTest::newRow("QFile") << QFileBenchmark; +#ifdef QT_BUILD_INTERNAL + QTest::newRow("QFSFileEngine") << QFSFileEngineBenchmark; +#endif + QTest::newRow("Posix FILE*") << PosixBenchmark; +#ifdef Q_OS_WIN + QTest::newRow("Win32 API") << Win32Benchmark; +#endif +} + +void tst_qfile::seek() +{ + QFETCH(tst_qfile::BenchmarkType, testType); + int i = 0; + + switch (testType) { + case QFileBenchmark: { + QFile file(tempDir.filename); + file.open(QIODevice::ReadOnly); + QBENCHMARK { + i=(i+1)%sp_size; + file.seek(seekpos[i]); + } + file.close(); + } + break; +#ifdef QT_BUILD_INTERNAL + case QFSFileEngineBenchmark: { + QFSFileEngine fse(tempDir.filename); + fse.open(QIODevice::ReadOnly | QIODevice::Unbuffered, std::nullopt); + QBENCHMARK { + i=(i+1)%sp_size; + fse.seek(seekpos[i]); + } + fse.close(); + } + break; +#endif + case PosixBenchmark: { + QByteArray data = tempDir.filename.toLocal8Bit(); + const char* cfilename = data.constData(); + FILE* cfile = ::fopen(cfilename, "rb"); + QBENCHMARK { + i=(i+1)%sp_size; + ::fseek(cfile, seekpos[i], SEEK_SET); + } + ::fclose(cfile); + } + break; + case QFileFromPosixBenchmark: { + // No gain in benchmarking this case + } + break; + case Win32Benchmark: { +#ifdef Q_OS_WIN + HANDLE hndl; + + // ensure we don't account string conversion + const wchar_t *cfilename = reinterpret_cast<const wchar_t *>(tempDir.filename.utf16()); + + hndl = CreateFile(cfilename, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0); + Q_ASSERT(hndl); + QBENCHMARK { + i=(i+1)%sp_size; + SetFilePointer(hndl, seekpos[i], NULL, 0); + } + CloseHandle(hndl); +#else + QFAIL("Not running on a Windows platform!"); +#endif + } + break; + } +} + +void tst_qfile::open_data() +{ + QTest::addColumn<tst_qfile::BenchmarkType>("testType"); + QTest::newRow("QFile") << QFileBenchmark; +#ifdef QT_BUILD_INTERNAL + QTest::newRow("QFSFileEngine") << QFSFileEngineBenchmark; +#endif + QTest::newRow("Posix FILE*") << PosixBenchmark; + QTest::newRow("QFile from FILE*") << QFileFromPosixBenchmark; +#ifdef Q_OS_WIN + QTest::newRow("Win32 API") << Win32Benchmark; +#endif +} + +void tst_qfile::open() +{ + QFETCH(tst_qfile::BenchmarkType, testType); + + switch (testType) { + case QFileBenchmark: { + QBENCHMARK { + QFile file(tempDir.filename); + file.open(QIODevice::ReadOnly); + file.close(); + } + } + break; +#ifdef QT_BUILD_INTERNAL + case QFSFileEngineBenchmark: { + QBENCHMARK { + QFSFileEngine fse(tempDir.filename); + fse.open(QIODevice::ReadOnly | QIODevice::Unbuffered, std::nullopt); + fse.close(); + } + } + break; +#endif + case PosixBenchmark: { + // ensure we don't account toLocal8Bit() + QByteArray data = tempDir.filename.toLocal8Bit(); + const char* cfilename = data.constData(); + + QBENCHMARK { + FILE* cfile = ::fopen(cfilename, "rb"); + ::fclose(cfile); + } + } + break; + case QFileFromPosixBenchmark: { + // ensure we don't account toLocal8Bit() + QByteArray data = tempDir.filename.toLocal8Bit(); + const char* cfilename = data.constData(); + FILE* cfile = ::fopen(cfilename, "rb"); + + QBENCHMARK { + QFile file; + file.open(cfile, QIODevice::ReadOnly); + file.close(); + } + ::fclose(cfile); + } + break; + case Win32Benchmark: { +#ifdef Q_OS_WIN + HANDLE hndl; + + // ensure we don't account string conversion + const wchar_t *cfilename = reinterpret_cast<const wchar_t *>(tempDir.filename.utf16()); + + QBENCHMARK { + hndl = CreateFile(cfilename, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0); + Q_ASSERT(hndl); + CloseHandle(hndl); + } +#else + QFAIL("Not running on a non-Windows platform!"); +#endif + } + break; + } +} + +void tst_qfile::readSmallFiles_QFile_data() +{ + readFile_data(QFileBenchmark, QIODevice::NotOpen, QIODevice::NotOpen); + readFile_data(QFileBenchmark, QIODevice::NotOpen, QIODevice::Unbuffered); + readFile_data(QFileBenchmark, QIODevice::Text, QIODevice::NotOpen); + readFile_data(QFileBenchmark, QIODevice::Text, QIODevice::Unbuffered); + +} + +void tst_qfile::readSmallFiles_QFSFileEngine_data() +{ +#ifdef QT_BUILD_INTERNAL + // Support for buffering dropped at 5.10, so only test Unbuffered + readFile_data(QFSFileEngineBenchmark, QIODevice::NotOpen, QIODevice::Unbuffered); + readFile_data(QFSFileEngineBenchmark, QIODevice::Text, QIODevice::Unbuffered); +#else + QSKIP("This test requires -developer-build."); +#endif +} + +void tst_qfile::readSmallFiles_posix_data() +{ + readFile_data(PosixBenchmark, QIODevice::NotOpen, QIODevice::NotOpen); +} + +void tst_qfile::readSmallFiles_Win32_data() +{ + +#ifdef Q_OS_WIN + readFile_data(Win32Benchmark, QIODevice::NotOpen, QIODevice::NotOpen); +#else + QSKIP("This is Windows only benchmark."); +#endif +} + +void tst_qfile::readSmallFiles() +{ + QFETCH(tst_qfile::BenchmarkType, testType); + QFETCH(int, blockSize); + QFETCH(QFile::OpenModeFlag, textMode); + QFETCH(QFile::OpenModeFlag, bufferedMode); + + QDir dir(tempDir.path()); + const QStringList files = dir.entryList(QDir::NoDotAndDotDot|QDir::NoSymLinks|QDir::Files); + char buffer[BUFSIZE]; + + switch (testType) { + case QFileBenchmark: { + QList<QFile*> fileList; + for (const QString &file : files) { + QFile *f = new QFile(tempDir.filePath(file)); + f->open(QIODevice::ReadOnly|textMode|bufferedMode); + fileList.append(f); + } + + QBENCHMARK { + for (QFile *const file : std::as_const(fileList)) { + while (!file->atEnd()) + file->read(buffer, blockSize); + } + } + + for (QFile *const file : std::as_const(fileList)) { + file->close(); + delete file; + } + } + break; +#ifdef QT_BUILD_INTERNAL + case QFSFileEngineBenchmark: { + QList<QFSFileEngine*> fileList; + for (const QString &file : files) { + QFSFileEngine *fse = new QFSFileEngine(tempDir.filePath(file)); + fse->open(QIODevice::ReadOnly | textMode | bufferedMode, std::nullopt); + fileList.append(fse); + } + + QBENCHMARK { + for (QFSFileEngine *const fse : std::as_const(fileList)) + while (fse->read(buffer, blockSize)) {} + } + + for (QFSFileEngine *const fse : std::as_const(fileList)) { + fse->close(); + delete fse; + } + } + break; +#endif + case PosixBenchmark: { + QList<FILE *> fileList; + for (const QString &file : files) + fileList.append(::fopen(QFile::encodeName(tempDir.filePath(file)).constData(), "rb")); + + QBENCHMARK { + for (FILE *const cfile : std::as_const(fileList)) { + while (!feof(cfile)) + [[maybe_unused]] auto f = ::fread(buffer, blockSize, 1, cfile); + ::fseek(cfile, 0, SEEK_SET); + } + } + + for (FILE *const cfile : std::as_const(fileList)) + ::fclose(cfile); + } + break; + case QFileFromPosixBenchmark: { + // No gain in benchmarking this case + } + break; + case Win32Benchmark: { +#ifdef Q_OS_WIN + HANDLE hndl; + + // ensure we don't account string conversion + const wchar_t *cfilename = reinterpret_cast<const wchar_t *>(tempDir.filename.utf16()); + + hndl = CreateFile(cfilename, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0); + Q_ASSERT(hndl); + wchar_t* nativeBuffer = new wchar_t[BUFSIZE]; + DWORD numberOfBytesRead; + QBENCHMARK { + do { + ReadFile(hndl, nativeBuffer, blockSize, &numberOfBytesRead, NULL); + } while(numberOfBytesRead != 0); + } + delete nativeBuffer; + CloseHandle(hndl); +#else + QFAIL("Not running on a non-Windows platform!"); +#endif + } + break; + } +} + +QTEST_MAIN(tst_qfile) + +#include "tst_bench_qfile.moc" diff --git a/tests/benchmarks/corelib/io/qfileinfo/CMakeLists.txt b/tests/benchmarks/corelib/io/qfileinfo/CMakeLists.txt index 1c088bf71a..84a667ca7d 100644 --- a/tests/benchmarks/corelib/io/qfileinfo/CMakeLists.txt +++ b/tests/benchmarks/corelib/io/qfileinfo/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qfileinfo.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qfileinfo Binary: @@ -6,11 +7,8 @@ qt_internal_add_benchmark(tst_bench_qfileinfo SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qfileinfo.cpp + LIBRARIES Qt::CorePrivate Qt::Test ) - -#### Keys ignored in scope 1:.:.:qfileinfo.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/io/qfileinfo/main.cpp b/tests/benchmarks/corelib/io/qfileinfo/tst_bench_qfileinfo.cpp index 2cd06eef27..2c626dde70 100644 --- a/tests/benchmarks/corelib/io/qfileinfo/main.cpp +++ b/tests/benchmarks/corelib/io/qfileinfo/tst_bench_qfileinfo.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QDebug> #include <qtest.h> #include <QTest> @@ -35,7 +10,7 @@ #include "private/qfsfileengine_p.h" #include "../../../../shared/filesystem.h" -class qfileinfo : public QObject +class tst_QFileInfo : public QObject { Q_OBJECT private slots: @@ -45,34 +20,22 @@ private slots: void symLinkTargetPerformanceLNK(); void junctionTargetPerformanceMountpoint(); #endif - void initTestCase(); - void cleanupTestCase(); -public: - qfileinfo() : QObject() {}; }; -void qfileinfo::initTestCase() -{ -} - -void qfileinfo::cleanupTestCase() -{ -} - -void qfileinfo::existsTemporary() +void tst_QFileInfo::existsTemporary() { QString appPath = QCoreApplication::applicationFilePath(); QBENCHMARK { QFileInfo(appPath).exists(); } } -void qfileinfo::existsStatic() +void tst_QFileInfo::existsStatic() { QString appPath = QCoreApplication::applicationFilePath(); QBENCHMARK { QFileInfo::exists(appPath); } } #if defined(Q_OS_WIN) -void qfileinfo::symLinkTargetPerformanceLNK() +void tst_QFileInfo::symLinkTargetPerformanceLNK() { QVERIFY(QFile::link("file","link.lnk")); QFileInfo info("link.lnk"); @@ -86,7 +49,7 @@ void qfileinfo::symLinkTargetPerformanceLNK() QVERIFY(QFile::remove("link.lnk")); } -void qfileinfo::junctionTargetPerformanceMountpoint() +void tst_QFileInfo::junctionTargetPerformanceMountpoint() { wchar_t buffer[MAX_PATH]; QString rootPath = QDir::toNativeSeparators(QDir::rootPath()); @@ -109,6 +72,6 @@ void qfileinfo::junctionTargetPerformanceMountpoint() } #endif -QTEST_MAIN(qfileinfo) +QTEST_MAIN(tst_QFileInfo) -#include "main.moc" +#include "tst_bench_qfileinfo.moc" diff --git a/tests/benchmarks/corelib/io/qiodevice/CMakeLists.txt b/tests/benchmarks/corelib/io/qiodevice/CMakeLists.txt index 3af6d4f214..133a9a1ac3 100644 --- a/tests/benchmarks/corelib/io/qiodevice/CMakeLists.txt +++ b/tests/benchmarks/corelib/io/qiodevice/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qiodevice.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qiodevice Binary: @@ -6,10 +7,7 @@ qt_internal_add_benchmark(tst_bench_qiodevice SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qiodevice.cpp + LIBRARIES Qt::Test ) - -#### Keys ignored in scope 1:.:.:qiodevice.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/io/qiodevice/main.cpp b/tests/benchmarks/corelib/io/qiodevice/tst_bench_qiodevice.cpp index de4660a253..cae90631ee 100644 --- a/tests/benchmarks/corelib/io/qiodevice/main.cpp +++ b/tests/benchmarks/corelib/io/qiodevice/tst_bench_qiodevice.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QDebug> #include <QIODevice> #include <QFile> @@ -32,8 +7,7 @@ #include <qtest.h> - -class tst_qiodevice : public QObject +class tst_QIODevice : public QObject { Q_OBJECT private slots: @@ -48,7 +22,7 @@ private: }; -void tst_qiodevice::read_data() +void tst_QIODevice::read_data() { QTest::addColumn<qint64>("size"); QTest::newRow("10k") << qint64(10 * 1024); @@ -59,7 +33,7 @@ void tst_qiodevice::read_data() QTest::newRow("1000000k") << qint64(1000000 * 1024); } -void tst_qiodevice::read_old() +void tst_QIODevice::read_old() { QFETCH(qint64, size); @@ -88,7 +62,7 @@ void tst_qiodevice::read_old() } } -void tst_qiodevice::peekAndRead() +void tst_QIODevice::peekAndRead() { QFETCH(qint64, size); @@ -119,6 +93,6 @@ void tst_qiodevice::peekAndRead() } } -QTEST_MAIN(tst_qiodevice) +QTEST_MAIN(tst_QIODevice) -#include "main.moc" +#include "tst_bench_qiodevice.moc" diff --git a/tests/benchmarks/corelib/io/qprocess/CMakeLists.txt b/tests/benchmarks/corelib/io/qprocess/CMakeLists.txt index d599539142..3f3ffd3d70 100644 --- a/tests/benchmarks/corelib/io/qprocess/CMakeLists.txt +++ b/tests/benchmarks/corelib/io/qprocess/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qprocess.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause add_subdirectory(testProcessLoopback) add_subdirectory(test) diff --git a/tests/benchmarks/corelib/io/qprocess/test/CMakeLists.txt b/tests/benchmarks/corelib/io/qprocess/test/CMakeLists.txt index ca7011a661..c8837d3d65 100644 --- a/tests/benchmarks/corelib/io/qprocess/test/CMakeLists.txt +++ b/tests/benchmarks/corelib/io/qprocess/test/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from test.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qprocess Binary: @@ -7,7 +8,7 @@ qt_internal_add_benchmark(tst_bench_qprocess SOURCES ../tst_bench_qprocess.cpp - PUBLIC_LIBRARIES + LIBRARIES Qt::CorePrivate Qt::Test ) diff --git a/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/CMakeLists.txt b/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/CMakeLists.txt index 896435b27b..cd486bd9cc 100644 --- a/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/CMakeLists.txt +++ b/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/CMakeLists.txt @@ -1,5 +1,8 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + ##################################################################### ## testProcessLoopback Binary: ##################################################################### -add_executable(testProcessLoopback main.cpp) +add_executable(testProcessLoopback loopback.cpp) diff --git a/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/loopback.cpp b/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/loopback.cpp new file mode 100644 index 0000000000..1f47f6b0f1 --- /dev/null +++ b/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/loopback.cpp @@ -0,0 +1,19 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + + +#include <stdio.h> + +int main() +{ + char buffer[1024]; + for (;;) { + size_t num = fread(buffer, 1, sizeof(buffer), stdin); + if (num <= 0) + break; + fwrite(buffer, num, 1, stdout); + fflush(stdout); + } + + return 0; +} diff --git a/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/main.cpp b/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/main.cpp deleted file mode 100644 index 1773ba7496..0000000000 --- a/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#include <stdio.h> - -int main() -{ - char buffer[1024]; - for (;;) { - size_t num = fread(buffer, 1, sizeof(buffer), stdin); - if (num <= 0) - break; - fwrite(buffer, num, 1, stdout); - fflush(stdout); - } - - return 0; -} diff --git a/tests/benchmarks/corelib/io/qprocess/tst_bench_qprocess.cpp b/tests/benchmarks/corelib/io/qprocess/tst_bench_qprocess.cpp index 7077ec631a..9cf87a6653 100644 --- a/tests/benchmarks/corelib/io/qprocess/tst_bench_qprocess.cpp +++ b/tests/benchmarks/corelib/io/qprocess/tst_bench_qprocess.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2020 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QTest> #include <QSignalSpy> @@ -40,10 +15,16 @@ private slots: void echoTest_performance(); }; +#ifdef Q_OS_WIN +# define EXE ".exe" +#else +# define EXE "" +#endif + void tst_QProcess::echoTest_performance() { QProcess process; - process.start("testProcessLoopback/testProcessLoopback"); + process.start(QFINDTESTDATA("../testProcessLoopback/testProcessLoopback" EXE)); QByteArray array; array.resize(1024 * 1024); @@ -62,9 +43,9 @@ void tst_QProcess::echoTest_performance() while (stopWatch.elapsed() < 2000) { process.write(array); while (process.bytesToWrite() > 0) { - int readCount = readyReadSpy.count(); + int readCount = readyReadSpy.size(); QVERIFY(process.waitForBytesWritten(5000)); - if (readyReadSpy.count() == readCount) + if (readyReadSpy.size() == readCount) QVERIFY(process.waitForReadyRead(5000)); } diff --git a/tests/benchmarks/corelib/io/qtemporaryfile/CMakeLists.txt b/tests/benchmarks/corelib/io/qtemporaryfile/CMakeLists.txt index a12bfd1260..a2a33a0dce 100644 --- a/tests/benchmarks/corelib/io/qtemporaryfile/CMakeLists.txt +++ b/tests/benchmarks/corelib/io/qtemporaryfile/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qtemporaryfile.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qtemporaryfile Binary: @@ -6,10 +7,7 @@ qt_internal_add_benchmark(tst_bench_qtemporaryfile SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qtemporaryfile.cpp + LIBRARIES Qt::Test ) - -#### Keys ignored in scope 1:.:.:qtemporaryfile.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/io/qtemporaryfile/main.cpp b/tests/benchmarks/corelib/io/qtemporaryfile/main.cpp deleted file mode 100644 index c50032d174..0000000000 --- a/tests/benchmarks/corelib/io/qtemporaryfile/main.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include <QDebug> -#include <QIODevice> -#include <QFile> -#include <QString> -#include <QTemporaryFile> -#include <qtest.h> - - -class tst_qtemporaryfile : public QObject -{ - Q_OBJECT -private slots: - void openclose_data(); - void openclose(); - void readwrite_data() { openclose_data(); } - void readwrite(); - -private: -}; - -void tst_qtemporaryfile::openclose_data() -{ - QTest::addColumn<qint64>("amount"); - QTest::newRow("100") << qint64(100); - QTest::newRow("1000") << qint64(1000); - QTest::newRow("10000") << qint64(10000); -} - -void tst_qtemporaryfile::openclose() -{ - QFETCH(qint64, amount); - - QBENCHMARK { - for (qint64 i = 0; i < amount; ++i) { - QTemporaryFile file; - file.open(); - file.close(); - } - } -} - -void tst_qtemporaryfile::readwrite() -{ - QFETCH(qint64, amount); - - const int dataSize = 4096; - QByteArray data; - data.fill('a', dataSize); - QBENCHMARK { - for (qint64 i = 0; i < amount; ++i) { - QTemporaryFile file; - file.open(); - file.write(data); - file.seek(0); - file.read(dataSize); - file.close(); - } - } -} - -QTEST_MAIN(tst_qtemporaryfile) - -#include "main.moc" diff --git a/tests/benchmarks/corelib/io/qtemporaryfile/tst_bench_qtemporaryfile.cpp b/tests/benchmarks/corelib/io/qtemporaryfile/tst_bench_qtemporaryfile.cpp new file mode 100644 index 0000000000..c72b525827 --- /dev/null +++ b/tests/benchmarks/corelib/io/qtemporaryfile/tst_bench_qtemporaryfile.cpp @@ -0,0 +1,64 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only +#include <QDebug> +#include <QIODevice> +#include <QFile> +#include <QString> +#include <QTemporaryFile> +#include <qtest.h> + +class tst_QTemporaryFile : public QObject +{ + Q_OBJECT +private slots: + void openclose_data(); + void openclose(); + void readwrite_data() { openclose_data(); } + void readwrite(); + +private: +}; + +void tst_QTemporaryFile::openclose_data() +{ + QTest::addColumn<qint64>("amount"); + QTest::newRow("100") << qint64(100); + QTest::newRow("1000") << qint64(1000); + QTest::newRow("10000") << qint64(10000); +} + +void tst_QTemporaryFile::openclose() +{ + QFETCH(qint64, amount); + + QBENCHMARK { + for (qint64 i = 0; i < amount; ++i) { + QTemporaryFile file; + file.open(); + file.close(); + } + } +} + +void tst_QTemporaryFile::readwrite() +{ + QFETCH(qint64, amount); + + const int dataSize = 4096; + QByteArray data; + data.fill('a', dataSize); + QBENCHMARK { + for (qint64 i = 0; i < amount; ++i) { + QTemporaryFile file; + file.open(); + file.write(data); + file.seek(0); + file.read(dataSize); + file.close(); + } + } +} + +QTEST_MAIN(tst_QTemporaryFile) + +#include "tst_bench_qtemporaryfile.moc" diff --git a/tests/benchmarks/corelib/io/qtextstream/CMakeLists.txt b/tests/benchmarks/corelib/io/qtextstream/CMakeLists.txt index 0393b91119..5e39b2fd90 100644 --- a/tests/benchmarks/corelib/io/qtextstream/CMakeLists.txt +++ b/tests/benchmarks/corelib/io/qtextstream/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qtextstream.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qtextstream Binary: @@ -6,10 +7,7 @@ qt_internal_add_benchmark(tst_bench_qtextstream SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qtextstream.cpp + LIBRARIES Qt::Test ) - -#### Keys ignored in scope 1:.:.:qtextstream.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/io/qtextstream/main.cpp b/tests/benchmarks/corelib/io/qtextstream/tst_bench_qtextstream.cpp index 03dc3d1694..74552b85cf 100644 --- a/tests/benchmarks/corelib/io/qtextstream/main.cpp +++ b/tests/benchmarks/corelib/io/qtextstream/tst_bench_qtextstream.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2014 David Faure <david.faure@kdab.com> -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2014 David Faure <david.faure@kdab.com> +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QDebug> #include <QIODevice> @@ -32,7 +7,7 @@ #include <QBuffer> #include <qtest.h> -class tst_qtextstream : public QObject +class tst_QTextStream : public QObject { Q_OBJECT private slots: @@ -48,7 +23,7 @@ Q_DECLARE_METATYPE(Output); enum Input { CharStarInput, QStringInput, CharInput, QCharInput }; Q_DECLARE_METATYPE(Input); -void tst_qtextstream::writeSingleChar_data() +void tst_QTextStream::writeSingleChar_data() { QTest::addColumn<Output>("output"); QTest::addColumn<Input>("input"); @@ -63,7 +38,7 @@ void tst_qtextstream::writeSingleChar_data() QTest::newRow("device_qchar") << DeviceOutput << QCharInput; } -void tst_qtextstream::writeSingleChar() +void tst_QTextStream::writeSingleChar() { QFETCH(Output, output); QFETCH(Input, input); @@ -115,6 +90,6 @@ void tst_qtextstream::writeSingleChar() QCOMPARE(result.left(10), QString("hhhhhhhhhh")); } -QTEST_MAIN(tst_qtextstream) +QTEST_MAIN(tst_QTextStream) -#include "main.moc" +#include "tst_bench_qtextstream.moc" diff --git a/tests/benchmarks/corelib/io/qurl/CMakeLists.txt b/tests/benchmarks/corelib/io/qurl/CMakeLists.txt index d38c8b18c0..fc8d48450d 100644 --- a/tests/benchmarks/corelib/io/qurl/CMakeLists.txt +++ b/tests/benchmarks/corelib/io/qurl/CMakeLists.txt @@ -1,23 +1,21 @@ -# Generated from qurl.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_qurl Binary: ##################################################################### -qt_internal_add_benchmark(tst_qurl +qt_internal_add_benchmark(tst_bench_qurl SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qurl.cpp + LIBRARIES Qt::Test ) -#### Keys ignored in scope 1:.:.:qurl.pro:<TRUE>: -# TEMPLATE = "app" - ## Scopes: ##################################################################### -qt_internal_extend_target(tst_qurl CONDITION WIN32 +qt_internal_extend_target(tst_bench_qurl CONDITION WIN32 DEFINES _CRT_SECURE_NO_WARNINGS ) diff --git a/tests/benchmarks/corelib/io/qurl/main.cpp b/tests/benchmarks/corelib/io/qurl/tst_bench_qurl.cpp index 5ad3c3bd47..87c4f51816 100644 --- a/tests/benchmarks/corelib/io/qurl/main.cpp +++ b/tests/benchmarks/corelib/io/qurl/tst_bench_qurl.cpp @@ -1,35 +1,10 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <qurl.h> #include <qtest.h> -class tst_qurl: public QObject +class tst_QUrl : public QObject { Q_OBJECT @@ -53,28 +28,28 @@ private: void generateFirstRunData(); }; -void tst_qurl::emptyUrl() +void tst_QUrl::emptyUrl() { QBENCHMARK { QUrl url; } } -void tst_qurl::relativeUrl() +void tst_QUrl::relativeUrl() { QBENCHMARK { QUrl url("pics/avatar.png"); } } -void tst_qurl::absoluteUrl() +void tst_QUrl::absoluteUrl() { QBENCHMARK { QUrl url("/tmp/avatar.png"); } } -void tst_qurl::generateFirstRunData() +void tst_QUrl::generateFirstRunData() { QTest::addColumn<bool>("firstRun"); @@ -82,12 +57,12 @@ void tst_qurl::generateFirstRunData() QTest::newRow("subsequent runs") << false; } -void tst_qurl::isRelative_data() +void tst_QUrl::isRelative_data() { generateFirstRunData(); } -void tst_qurl::isRelative() +void tst_QUrl::isRelative() { QFETCH(bool, firstRun); if (firstRun) { @@ -103,12 +78,12 @@ void tst_qurl::isRelative() } } -void tst_qurl::toLocalFile_data() +void tst_QUrl::toLocalFile_data() { generateFirstRunData(); } -void tst_qurl::toLocalFile() +void tst_QUrl::toLocalFile() { QFETCH(bool, firstRun); if (firstRun) { @@ -124,12 +99,12 @@ void tst_qurl::toLocalFile() } } -void tst_qurl::toString_data() +void tst_QUrl::toString_data() { generateFirstRunData(); } -void tst_qurl::toString() +void tst_QUrl::toString() { QFETCH(bool, firstRun); if(firstRun) { @@ -145,35 +120,37 @@ void tst_qurl::toString() } } -void tst_qurl::resolved_data() +void tst_QUrl::resolved_data() { generateFirstRunData(); } -void tst_qurl::resolved() +void tst_QUrl::resolved() { QFETCH(bool, firstRun); - if(firstRun) { + QUrl expect("/home/user/pics/avatar.png"), actual; + if (firstRun) { QBENCHMARK { QUrl baseUrl("/home/user/"); QUrl url("pics/avatar.png"); - baseUrl.resolved(url); + actual = baseUrl.resolved(url); } } else { QUrl baseUrl("/home/user/"); QUrl url("pics/avatar.png"); QBENCHMARK { - baseUrl.resolved(url); + actual = baseUrl.resolved(url); } } + QCOMPARE(actual, expect); } -void tst_qurl::equality_data() +void tst_QUrl::equality_data() { generateFirstRunData(); } -void tst_qurl::equality() +void tst_QUrl::equality() { QFETCH(bool, firstRun); if(firstRun) { @@ -186,12 +163,12 @@ void tst_qurl::equality() QUrl url("pics/avatar.png"); QUrl url2("pics/avatar2.png"); QBENCHMARK { - url == url2; + [[maybe_unused]] auto r = url == url2; } } } -void tst_qurl::qmlPropertyWriteUseCase() +void tst_QUrl::qmlPropertyWriteUseCase() { QUrl base("file:///home/user/qt/examples/declarative/samegame/SamegameCore/"); QString str("pics/redStar.png"); @@ -203,6 +180,6 @@ void tst_qurl::qmlPropertyWriteUseCase() } } -QTEST_MAIN(tst_qurl) +QTEST_MAIN(tst_QUrl) -#include "main.moc" +#include "tst_bench_qurl.moc" diff --git a/tests/benchmarks/corelib/itemmodels/CMakeLists.txt b/tests/benchmarks/corelib/itemmodels/CMakeLists.txt index c74f36709c..8dc331aee2 100644 --- a/tests/benchmarks/corelib/itemmodels/CMakeLists.txt +++ b/tests/benchmarks/corelib/itemmodels/CMakeLists.txt @@ -1 +1,6 @@ -add_subdirectory(qsortfilterproxymodel) +# Copyright (C) 2024 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +if(QT_FEATURE_proxymodel) + add_subdirectory(qsortfilterproxymodel) +endif() diff --git a/tests/benchmarks/corelib/itemmodels/qsortfilterproxymodel/CMakeLists.txt b/tests/benchmarks/corelib/itemmodels/qsortfilterproxymodel/CMakeLists.txt index a18678159b..f6f45fa1f4 100644 --- a/tests/benchmarks/corelib/itemmodels/qsortfilterproxymodel/CMakeLists.txt +++ b/tests/benchmarks/corelib/itemmodels/qsortfilterproxymodel/CMakeLists.txt @@ -1,6 +1,9 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + qt_internal_add_benchmark(tst_bench_qsortfilterproxymodel SOURCES - tst_qsortfilterproxymodel.cpp - PUBLIC_LIBRARIES + tst_bench_qsortfilterproxymodel.cpp + LIBRARIES Qt::Test ) diff --git a/tests/benchmarks/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp b/tests/benchmarks/corelib/itemmodels/qsortfilterproxymodel/tst_bench_qsortfilterproxymodel.cpp index f7fc0963bc..0411972ce3 100644 --- a/tests/benchmarks/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp +++ b/tests/benchmarks/corelib/itemmodels/qsortfilterproxymodel/tst_bench_qsortfilterproxymodel.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2021 Igor Kushnir <igorkuo@gmail.com> -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2021 Igor Kushnir <igorkuo@gmail.com> +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QSortFilterProxyModel> #include <QString> @@ -56,6 +31,7 @@ class tst_QSortFilterProxyModel : public QObject private slots: void clearFilter_data(); void clearFilter(); + void setSourceModel(); private: QStringList m_numberList; ///< Cache the strings for efficiency. @@ -97,7 +73,7 @@ void tst_QSortFilterProxyModel::clearFilter() { QFETCH(const int, itemCount); resizeNumberList(m_numberList, itemCount); - QStringListModel model(qAsConst(m_numberList)); + QStringListModel model(std::as_const(m_numberList)); QCOMPARE(model.rowCount(), itemCount); QSortFilterProxyModel proxy; @@ -118,6 +94,19 @@ void tst_QSortFilterProxyModel::clearFilter() QCOMPARE(proxy.rowCount(), itemCount); } +void tst_QSortFilterProxyModel::setSourceModel() +{ + QStringListModel model1; + QStringListModel model2; + + QSortFilterProxyModel proxy; + + QBENCHMARK { + proxy.setSourceModel(&model1); + proxy.setSourceModel(&model2); + } +} + QTEST_MAIN(tst_QSortFilterProxyModel) -#include "tst_qsortfilterproxymodel.moc" +#include "tst_bench_qsortfilterproxymodel.moc" diff --git a/tests/benchmarks/corelib/json/CMakeLists.txt b/tests/benchmarks/corelib/json/CMakeLists.txt index 657a268741..f4feb1ebdb 100644 --- a/tests/benchmarks/corelib/json/CMakeLists.txt +++ b/tests/benchmarks/corelib/json/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from json.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qtjson Binary: @@ -7,9 +8,6 @@ qt_internal_add_benchmark(tst_bench_qtjson SOURCES tst_bench_qtjson.cpp - PUBLIC_LIBRARIES + LIBRARIES Qt::Test ) - -#### Keys ignored in scope 1:.:.:json.pro:<TRUE>: -# TESTDATA = "numbers.json" "test.json" diff --git a/tests/benchmarks/corelib/json/tst_bench_qtjson.cpp b/tests/benchmarks/corelib/json/tst_bench_qtjson.cpp index 1dc7fb322c..2202b9a576 100644 --- a/tests/benchmarks/corelib/json/tst_bench_qtjson.cpp +++ b/tests/benchmarks/corelib/json/tst_bench_qtjson.cpp @@ -1,32 +1,8 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QTest> +#include <QVariantMap> #include <qjsondocument.h> #include <qjsonobject.h> diff --git a/tests/benchmarks/corelib/kernel/CMakeLists.txt b/tests/benchmarks/corelib/kernel/CMakeLists.txt index 34d457bb21..137ef37298 100644 --- a/tests/benchmarks/corelib/kernel/CMakeLists.txt +++ b/tests/benchmarks/corelib/kernel/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from kernel.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause add_subdirectory(events) add_subdirectory(qmetatype) @@ -6,6 +7,7 @@ add_subdirectory(qvariant) add_subdirectory(qcoreapplication) add_subdirectory(qtimer_vs_qmetaobject) add_subdirectory(qproperty) +add_subdirectory(qmetaenum) if(TARGET Qt::Widgets) add_subdirectory(qmetaobject) add_subdirectory(qobject) diff --git a/tests/benchmarks/corelib/kernel/events/CMakeLists.txt b/tests/benchmarks/corelib/kernel/events/CMakeLists.txt index 41add9350e..ba175fd3a0 100644 --- a/tests/benchmarks/corelib/kernel/events/CMakeLists.txt +++ b/tests/benchmarks/corelib/kernel/events/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from events.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_events Binary: @@ -6,10 +7,7 @@ qt_internal_add_benchmark(tst_bench_events SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_events.cpp + LIBRARIES Qt::Test ) - -#### Keys ignored in scope 1:.:.:events.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/kernel/events/main.cpp b/tests/benchmarks/corelib/kernel/events/tst_bench_events.cpp index 973d96261c..17eb838af2 100644 --- a/tests/benchmarks/corelib/kernel/events/main.cpp +++ b/tests/benchmarks/corelib/kernel/events/tst_bench_events.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QtCore> #include <qtest.h> @@ -113,6 +88,7 @@ void EventsBench::noEvent() QBENCHMARK { val += tst.foo(1); } + QVERIFY(val > 0); } void EventsBench::sendEvent_data() @@ -171,4 +147,4 @@ void EventsBench::postEvent() QTEST_MAIN(EventsBench) -#include "main.moc" +#include "tst_bench_events.moc" diff --git a/tests/benchmarks/corelib/kernel/qcoreapplication/CMakeLists.txt b/tests/benchmarks/corelib/kernel/qcoreapplication/CMakeLists.txt index 1618997909..1a553199d3 100644 --- a/tests/benchmarks/corelib/kernel/qcoreapplication/CMakeLists.txt +++ b/tests/benchmarks/corelib/kernel/qcoreapplication/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qcoreapplication.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qcoreapplication Binary: @@ -6,10 +7,7 @@ qt_internal_add_benchmark(tst_bench_qcoreapplication SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qcoreapplication.cpp + LIBRARIES Qt::Test ) - -#### Keys ignored in scope 1:.:.:qcoreapplication.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/kernel/qcoreapplication/main.cpp b/tests/benchmarks/corelib/kernel/qcoreapplication/main.cpp deleted file mode 100644 index 018f689785..0000000000 --- a/tests/benchmarks/corelib/kernel/qcoreapplication/main.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Robin Burchell <robin+qt@viroteck.net> -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include <QtCore> -#include <qtest.h> -#include <qcoreapplication.h> - -class QCoreApplicationBenchmark : public QObject -{ -Q_OBJECT -private slots: - void event_posting_benchmark_data(); - void event_posting_benchmark(); -}; - -void QCoreApplicationBenchmark::event_posting_benchmark_data() -{ - QTest::addColumn<int>("size"); - QTest::newRow("50 events") << 50; - QTest::newRow("100 events") << 100; - QTest::newRow("200 events") << 200; - QTest::newRow("1000 events") << 1000; - QTest::newRow("10000 events") << 10000; - QTest::newRow("100000 events") << 100000; - QTest::newRow("1000000 events") << 1000000; -} - -void QCoreApplicationBenchmark::event_posting_benchmark() -{ - QFETCH(int, size); - - int type = QEvent::registerEventType(); - QCoreApplication *app = QCoreApplication::instance(); - - // benchmark posting & sending events - QBENCHMARK { - for (int i = 0; i < size; ++i) - QCoreApplication::postEvent(app, new QEvent(QEvent::Type(type))); - QCoreApplication::sendPostedEvents(); - } -} - -QTEST_MAIN(QCoreApplicationBenchmark) - -#include "main.moc" diff --git a/tests/benchmarks/corelib/kernel/qcoreapplication/tst_bench_qcoreapplication.cpp b/tests/benchmarks/corelib/kernel/qcoreapplication/tst_bench_qcoreapplication.cpp new file mode 100644 index 0000000000..d2ff489784 --- /dev/null +++ b/tests/benchmarks/corelib/kernel/qcoreapplication/tst_bench_qcoreapplication.cpp @@ -0,0 +1,70 @@ +// Copyright (C) 2011 Robin Burchell <robin+qt@viroteck.net> +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only +#include <QtCore> +#include <qtest.h> +#include <qcoreapplication.h> + +class tst_QCoreApplication : public QObject +{ +Q_OBJECT +private slots: + void event_posting_benchmark_data(); + void event_posting_benchmark(); + + void event_posting_multiple_objects_benchmark_data(); + void event_posting_multiple_objects_benchmark(); +}; + +void tst_QCoreApplication::event_posting_benchmark_data() +{ + QTest::addColumn<int>("size"); + QTest::newRow("50 events") << 50; + QTest::newRow("100 events") << 100; + QTest::newRow("200 events") << 200; + QTest::newRow("1000 events") << 1000; + QTest::newRow("10000 events") << 10000; + QTest::newRow("100000 events") << 100000; + QTest::newRow("1000000 events") << 1000000; +} + +void tst_QCoreApplication::event_posting_benchmark() +{ + QFETCH(int, size); + + int type = QEvent::registerEventType(); + QCoreApplication *app = QCoreApplication::instance(); + + // benchmark posting & sending events + QBENCHMARK { + for (int i = 0; i < size; ++i) + QCoreApplication::postEvent(app, new QEvent(QEvent::Type(type))); + QCoreApplication::sendPostedEvents(); + } +} + +void tst_QCoreApplication::event_posting_multiple_objects_benchmark_data() +{ + event_posting_benchmark_data(); +} + +void tst_QCoreApplication::event_posting_multiple_objects_benchmark() +{ + QFETCH(int, size); + + QObject objects[15]; // The size of the array has not been chosen through any meaningful means + + QRandomGenerator gen; + + // benchmark posting & sending events + QBENCHMARK { + for (int i = 0; i < size; ++i) { + QCoreApplication::postEvent(&objects[gen.bounded(0, int(std::size(objects)))], + new QTimerEvent(i % 10)); + } + QCoreApplication::sendPostedEvents(); + } +} + +QTEST_MAIN(tst_QCoreApplication) + +#include "tst_bench_qcoreapplication.moc" diff --git a/tests/benchmarks/corelib/kernel/qmetaenum/CMakeLists.txt b/tests/benchmarks/corelib/kernel/qmetaenum/CMakeLists.txt new file mode 100644 index 0000000000..78bc30ea73 --- /dev/null +++ b/tests/benchmarks/corelib/kernel/qmetaenum/CMakeLists.txt @@ -0,0 +1,10 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +qt_internal_add_benchmark(tst_bench_qmetaenum + SOURCES + tst_bench_qmetaenum.cpp + LIBRARIES + Qt::Core + Qt::Test +) diff --git a/tests/benchmarks/corelib/kernel/qmetaenum/tst_bench_qmetaenum.cpp b/tests/benchmarks/corelib/kernel/qmetaenum/tst_bench_qmetaenum.cpp new file mode 100644 index 0000000000..1a88c49993 --- /dev/null +++ b/tests/benchmarks/corelib/kernel/qmetaenum/tst_bench_qmetaenum.cpp @@ -0,0 +1,55 @@ +// Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com> +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QMetaEnum> +#include <QTest> + +class tst_QMetaEnum: public QObject +{ + Q_OBJECT +public: + using QObject::QObject; + +private Q_SLOTS: + void valueToKeys_data(); + void valueToKeys(); + void keysToValue_data() { valueToKeys_data(); } + void keysToValue(); +}; + +void tst_QMetaEnum::valueToKeys_data() +{ + QTest::addColumn<int>("buttons"); + QTest::addColumn<QByteArray>("string"); + // Qt::MouseButtons has at least 24 enumerators, so it's a good performance test + const auto me = QMetaEnum::fromType<Qt::MouseButtons>(); + int accu = 0; + for (int i = 0; i < std::min(31, me.keyCount()); ++i) { + accu <<= 1; + accu |= 1; + QTest::addRow("%d bits set", i) << accu << me.valueToKeys(accu); + } +} + +void tst_QMetaEnum::valueToKeys() +{ + QFETCH(const int, buttons); + const auto me = QMetaEnum::fromType<Qt::MouseButtons>(); + QBENCHMARK { + [[maybe_unused]] auto r = me.valueToKeys(buttons); + } +} + +void tst_QMetaEnum::keysToValue() +{ + QFETCH(const QByteArray, string); + const auto me = QMetaEnum::fromType<Qt::MouseButtons>(); + bool ok; + QBENCHMARK { + [[maybe_unused]] auto r = me.keysToValue(string.data(), &ok); + } +} + +QTEST_MAIN(tst_QMetaEnum) + +#include "tst_bench_qmetaenum.moc" diff --git a/tests/benchmarks/corelib/kernel/qmetaobject/CMakeLists.txt b/tests/benchmarks/corelib/kernel/qmetaobject/CMakeLists.txt index db4c3ab12e..9e17608c57 100644 --- a/tests/benchmarks/corelib/kernel/qmetaobject/CMakeLists.txt +++ b/tests/benchmarks/corelib/kernel/qmetaobject/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qmetaobject.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qmetaobject Binary: @@ -6,12 +7,9 @@ qt_internal_add_benchmark(tst_bench_qmetaobject SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qmetaobject.cpp + LIBRARIES Qt::Gui Qt::Test Qt::Widgets ) - -#### Keys ignored in scope 1:.:.:qmetaobject.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/kernel/qmetaobject/main.cpp b/tests/benchmarks/corelib/kernel/qmetaobject/tst_bench_qmetaobject.cpp index 262dca7d52..6b02fb4ba4 100644 --- a/tests/benchmarks/corelib/kernel/qmetaobject/main.cpp +++ b/tests/benchmarks/corelib/kernel/qmetaobject/tst_bench_qmetaobject.cpp @@ -1,35 +1,10 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QtCore> #include <QtWidgets/QTreeView> #include <qtest.h> -class LotsOfSignals : public QObject +class LotsOfSignals : public QObject // for the unconnected() test { Q_OBJECT public: @@ -107,13 +82,10 @@ signals: void extraSignal70(); }; -class tst_qmetaobject: public QObject +class tst_QMetaObject: public QObject { Q_OBJECT private slots: - void initTestCase(); - void cleanupTestCase(); - void indexOfProperty_data(); void indexOfProperty(); void indexOfMethod_data(); @@ -127,15 +99,7 @@ private slots: void unconnected(); }; -void tst_qmetaobject::initTestCase() -{ -} - -void tst_qmetaobject::cleanupTestCase() -{ -} - -void tst_qmetaobject::indexOfProperty_data() +void tst_QMetaObject::indexOfProperty_data() { QTest::addColumn<QByteArray>("name"); const QMetaObject *mo = &QTreeView::staticMetaObject; @@ -145,7 +109,7 @@ void tst_qmetaobject::indexOfProperty_data() } } -void tst_qmetaobject::indexOfProperty() +void tst_QMetaObject::indexOfProperty() { QFETCH(QByteArray, name); const char *p = name.constData(); @@ -155,7 +119,7 @@ void tst_qmetaobject::indexOfProperty() } } -void tst_qmetaobject::indexOfMethod_data() +void tst_QMetaObject::indexOfMethod_data() { QTest::addColumn<QByteArray>("method"); const QMetaObject *mo = &QTreeView::staticMetaObject; @@ -166,7 +130,7 @@ void tst_qmetaobject::indexOfMethod_data() } } -void tst_qmetaobject::indexOfMethod() +void tst_QMetaObject::indexOfMethod() { QFETCH(QByteArray, method); const char *p = method.constData(); @@ -176,7 +140,7 @@ void tst_qmetaobject::indexOfMethod() } } -void tst_qmetaobject::indexOfSignal_data() +void tst_QMetaObject::indexOfSignal_data() { QTest::addColumn<QByteArray>("signal"); const QMetaObject *mo = &QTreeView::staticMetaObject; @@ -189,7 +153,7 @@ void tst_qmetaobject::indexOfSignal_data() } } -void tst_qmetaobject::indexOfSignal() +void tst_QMetaObject::indexOfSignal() { QFETCH(QByteArray, signal); const char *p = signal.constData(); @@ -199,7 +163,7 @@ void tst_qmetaobject::indexOfSignal() } } -void tst_qmetaobject::indexOfSlot_data() +void tst_QMetaObject::indexOfSlot_data() { QTest::addColumn<QByteArray>("slot"); const QMetaObject *mo = &QTreeView::staticMetaObject; @@ -212,7 +176,7 @@ void tst_qmetaobject::indexOfSlot_data() } } -void tst_qmetaobject::indexOfSlot() +void tst_QMetaObject::indexOfSlot() { QFETCH(QByteArray, slot); const char *p = slot.constData(); @@ -222,7 +186,7 @@ void tst_qmetaobject::indexOfSlot() } } -void tst_qmetaobject::unconnected_data() +void tst_QMetaObject::unconnected_data() { QTest::addColumn<int>("signal_index"); QTest::newRow("signal--9") << 9; @@ -233,7 +197,7 @@ void tst_qmetaobject::unconnected_data() QTest::newRow("signal--70") << 70; } -void tst_qmetaobject::unconnected() +void tst_QMetaObject::unconnected() { LotsOfSignals *obj = new LotsOfSignals; QFETCH(int, signal_index); @@ -247,6 +211,6 @@ void tst_qmetaobject::unconnected() delete obj; } -QTEST_MAIN(tst_qmetaobject) +QTEST_MAIN(tst_QMetaObject) -#include "main.moc" +#include "tst_bench_qmetaobject.moc" diff --git a/tests/benchmarks/corelib/kernel/qmetatype/CMakeLists.txt b/tests/benchmarks/corelib/kernel/qmetatype/CMakeLists.txt index ae4bc9c906..f24a29d144 100644 --- a/tests/benchmarks/corelib/kernel/qmetatype/CMakeLists.txt +++ b/tests/benchmarks/corelib/kernel/qmetatype/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qmetatype.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qmetatype Binary: @@ -6,10 +7,7 @@ qt_internal_add_benchmark(tst_bench_qmetatype SOURCES - tst_qmetatype.cpp - PUBLIC_LIBRARIES + tst_bench_qmetatype.cpp + LIBRARIES Qt::Test ) - -#### Keys ignored in scope 1:.:.:qmetatype.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/benchmarks/corelib/kernel/qmetatype/tst_bench_qmetatype.cpp index d41823de71..94adfa4a8c 100644 --- a/tests/benchmarks/corelib/kernel/qmetatype/tst_qmetatype.cpp +++ b/tests/benchmarks/corelib/kernel/qmetatype/tst_bench_qmetatype.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <qtest.h> #include <QtCore/qmetatype.h> @@ -321,4 +296,4 @@ void tst_QMetaType::constructInPlaceCopyStaticLess() } QTEST_MAIN(tst_QMetaType) -#include "tst_qmetatype.moc" +#include "tst_bench_qmetatype.moc" diff --git a/tests/benchmarks/corelib/kernel/qobject/CMakeLists.txt b/tests/benchmarks/corelib/kernel/qobject/CMakeLists.txt index ce834905b0..15b71f0d60 100644 --- a/tests/benchmarks/corelib/kernel/qobject/CMakeLists.txt +++ b/tests/benchmarks/corelib/kernel/qobject/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qobject.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qobject Binary: @@ -6,13 +7,10 @@ qt_internal_add_benchmark(tst_bench_qobject SOURCES - main.cpp + tst_bench_qobject.cpp object.cpp object.h - PUBLIC_LIBRARIES + LIBRARIES Qt::Gui Qt::Test Qt::Widgets ) - -#### Keys ignored in scope 1:.:.:qobject.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/kernel/qobject/object.cpp b/tests/benchmarks/corelib/kernel/qobject/object.cpp index 11da3f09c1..9e0fba2e98 100644 --- a/tests/benchmarks/corelib/kernel/qobject/object.cpp +++ b/tests/benchmarks/corelib/kernel/qobject/object.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include "object.h" void Object::emitSignal0() diff --git a/tests/benchmarks/corelib/kernel/qobject/object.h b/tests/benchmarks/corelib/kernel/qobject/object.h index 271c4b9ac6..72705f7f34 100644 --- a/tests/benchmarks/corelib/kernel/qobject/object.h +++ b/tests/benchmarks/corelib/kernel/qobject/object.h @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #ifndef OBJECT_H #define OBJECT_H diff --git a/tests/benchmarks/corelib/kernel/qobject/main.cpp b/tests/benchmarks/corelib/kernel/qobject/tst_bench_qobject.cpp index 918227f74e..99c15f6317 100644 --- a/tests/benchmarks/corelib/kernel/qobject/main.cpp +++ b/tests/benchmarks/corelib/kernel/qobject/tst_bench_qobject.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QtCore> #include <QtWidgets/QTreeView> #include <qtest.h> @@ -37,7 +12,7 @@ enum { SignalsAndSlotsBenchmarkConstant = 456789 }; -class QObjectBenchmark : public QObject +class tst_QObject : public QObject { Q_OBJECT private slots: @@ -95,7 +70,7 @@ inline void allocator() } } -void QObjectBenchmark::stdAllocator() +void tst_QObject::stdAllocator() { allocator<QObjectUsingStandardAllocator>(); } @@ -104,7 +79,7 @@ struct Functor { void operator()(){} }; -void QObjectBenchmark::signal_slot_benchmark_data() +void tst_QObject::signal_slot_benchmark_data() { QTest::addColumn<int>("type"); QTest::newRow("simple function") << 0; @@ -115,7 +90,7 @@ void QObjectBenchmark::signal_slot_benchmark_data() QTest::newRow("functor") << 5; } -void QObjectBenchmark::signal_slot_benchmark() +void tst_QObject::signal_slot_benchmark() { QFETCH(int, type); @@ -176,7 +151,7 @@ void QObjectBenchmark::signal_slot_benchmark() } } -void QObjectBenchmark::signal_many_receivers_data() +void tst_QObject::signal_many_receivers_data() { QTest::addColumn<int>("receiverCount"); QTest::newRow("100 receivers") << 100; @@ -184,7 +159,7 @@ void QObjectBenchmark::signal_many_receivers_data() QTest::newRow("10 000 receivers") << 10000; } -void QObjectBenchmark::signal_many_receivers() +void tst_QObject::signal_many_receivers() { QFETCH(int, receiverCount); Object sender; @@ -198,7 +173,7 @@ void QObjectBenchmark::signal_many_receivers() } } -void QObjectBenchmark::qproperty_benchmark_data() +void tst_QObject::qproperty_benchmark_data() { QTest::addColumn<QByteArray>("name"); const QMetaObject *mo = &QTreeView::staticMetaObject; @@ -209,7 +184,7 @@ void QObjectBenchmark::qproperty_benchmark_data() } } -void QObjectBenchmark::qproperty_benchmark() +void tst_QObject::qproperty_benchmark() { QFETCH(QByteArray, name); const char *p = name.constData(); @@ -221,7 +196,7 @@ void QObjectBenchmark::qproperty_benchmark() } } -void QObjectBenchmark::dynamic_property_benchmark() +void tst_QObject::dynamic_property_benchmark() { QTreeView obj; QBENCHMARK { @@ -232,7 +207,7 @@ void QObjectBenchmark::dynamic_property_benchmark() } } -void QObjectBenchmark::connect_disconnect_benchmark_data() +void tst_QObject::connect_disconnect_benchmark_data() { QTest::addColumn<int>("type"); QTest::newRow("normalized signature") << 0; @@ -243,7 +218,7 @@ void QObjectBenchmark::connect_disconnect_benchmark_data() QTest::newRow("function pointer/handle") << 5; QTest::newRow("functor/handle") << 6;} -void QObjectBenchmark::connect_disconnect_benchmark() +void tst_QObject::connect_disconnect_benchmark() { QFETCH(int, type); switch (type) { @@ -296,7 +271,7 @@ void QObjectBenchmark::connect_disconnect_benchmark() } } -void QObjectBenchmark::receiver_destroyed_benchmark() +void tst_QObject::receiver_destroyed_benchmark() { Object sender; QBENCHMARK { @@ -305,6 +280,6 @@ void QObjectBenchmark::receiver_destroyed_benchmark() } } -QTEST_MAIN(QObjectBenchmark) +QTEST_MAIN(tst_QObject) -#include "main.moc" +#include "tst_bench_qobject.moc" diff --git a/tests/benchmarks/corelib/kernel/qproperty/CMakeLists.txt b/tests/benchmarks/corelib/kernel/qproperty/CMakeLists.txt index d6fc1c5a14..1a26f28f05 100644 --- a/tests/benchmarks/corelib/kernel/qproperty/CMakeLists.txt +++ b/tests/benchmarks/corelib/kernel/qproperty/CMakeLists.txt @@ -1,8 +1,11 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + qt_internal_add_benchmark(tst_bench_qproperty SOURCES - main.cpp + tst_bench_qproperty.cpp propertytester.h - PUBLIC_LIBRARIES + LIBRARIES Qt::Core Qt::Test ) diff --git a/tests/benchmarks/corelib/kernel/qproperty/propertytester.h b/tests/benchmarks/corelib/kernel/qproperty/propertytester.h index daf55f8396..a89d51c286 100644 --- a/tests/benchmarks/corelib/kernel/qproperty/propertytester.h +++ b/tests/benchmarks/corelib/kernel/qproperty/propertytester.h @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #ifndef PROPERTYTESTER_H #define PROPERTYTESTER_H diff --git a/tests/benchmarks/corelib/kernel/qproperty/main.cpp b/tests/benchmarks/corelib/kernel/qproperty/tst_bench_qproperty.cpp index 5d6db35d2b..c91ca1ea11 100644 --- a/tests/benchmarks/corelib/kernel/qproperty/main.cpp +++ b/tests/benchmarks/corelib/kernel/qproperty/tst_bench_qproperty.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QScopedPointer> #include <QProperty> @@ -33,7 +8,7 @@ #include "propertytester.h" -class PropertyBenchmark : public QObject +class tst_QProperty : public QObject { Q_OBJECT private slots: @@ -53,7 +28,7 @@ private slots: void cppNotifyingDirectReadOnce(); }; -void PropertyBenchmark::cppOldBinding() +void tst_QProperty::cppOldBinding() { QScopedPointer<PropertyTester> tester {new PropertyTester}; auto connection = connect(tester.data(), &PropertyTester::xOldChanged, @@ -70,7 +45,7 @@ void PropertyBenchmark::cppOldBinding() QObject::disconnect(connection); } -void PropertyBenchmark::cppOldBindingDirect() +void tst_QProperty::cppOldBindingDirect() { QScopedPointer<PropertyTester> tester {new PropertyTester}; auto connection = connect(tester.data(), &PropertyTester::xOldChanged, @@ -87,7 +62,7 @@ void PropertyBenchmark::cppOldBindingDirect() QObject::disconnect(connection); } -void PropertyBenchmark::cppOldBindingReadOnce() +void tst_QProperty::cppOldBindingReadOnce() { QScopedPointer<PropertyTester> tester {new PropertyTester}; auto connection = connect(tester.data(), &PropertyTester::xOldChanged, @@ -103,7 +78,7 @@ void PropertyBenchmark::cppOldBindingReadOnce() QObject::disconnect(connection); } -void PropertyBenchmark::cppOldBindingDirectReadOnce() +void tst_QProperty::cppOldBindingDirectReadOnce() { QScopedPointer<PropertyTester> tester {new PropertyTester}; auto connection = connect(tester.data(), &PropertyTester::xOldChanged, @@ -119,7 +94,7 @@ void PropertyBenchmark::cppOldBindingDirectReadOnce() QObject::disconnect(connection); } -void PropertyBenchmark::cppNewBinding() +void tst_QProperty::cppNewBinding() { QScopedPointer<PropertyTester> tester {new PropertyTester}; tester->y.setBinding([&](){return tester->x.value();}); @@ -133,7 +108,7 @@ void PropertyBenchmark::cppNewBinding() } } -void PropertyBenchmark::cppNewBindingDirect() +void tst_QProperty::cppNewBindingDirect() { QScopedPointer<PropertyTester> tester {new PropertyTester}; tester->y.setBinding([&](){return tester->x.value();}); @@ -146,7 +121,7 @@ void PropertyBenchmark::cppNewBindingDirect() } } -void PropertyBenchmark::cppNewBindingReadOnce() +void tst_QProperty::cppNewBindingReadOnce() { QScopedPointer<PropertyTester> tester {new PropertyTester}; tester->y.setBinding([&](){return tester->x.value();}); @@ -160,7 +135,7 @@ void PropertyBenchmark::cppNewBindingReadOnce() QCOMPARE(tester->property("y").toInt(), i); } -void PropertyBenchmark::cppNewBindingDirectReadOnce() +void tst_QProperty::cppNewBindingDirectReadOnce() { QScopedPointer<PropertyTester> tester {new PropertyTester}; tester->y.setBinding([&](){return tester->x.value();}); @@ -173,7 +148,7 @@ void PropertyBenchmark::cppNewBindingDirectReadOnce() QCOMPARE(tester->y.value(), i); } -void PropertyBenchmark::cppNotifying() +void tst_QProperty::cppNotifying() { QScopedPointer<PropertyTester> tester {new PropertyTester}; tester->yNotified.setBinding([&](){return tester->xNotified.value();}); @@ -187,7 +162,7 @@ void PropertyBenchmark::cppNotifying() } } -void PropertyBenchmark::cppNotifyingDirect() +void tst_QProperty::cppNotifyingDirect() { QScopedPointer<PropertyTester> tester {new PropertyTester}; tester->yNotified.setBinding([&](){return tester->xNotified.value();}); @@ -200,7 +175,7 @@ void PropertyBenchmark::cppNotifyingDirect() } } -void PropertyBenchmark::cppNotifyingReadOnce() +void tst_QProperty::cppNotifyingReadOnce() { QScopedPointer<PropertyTester> tester {new PropertyTester}; tester->yNotified.setBinding([&](){return tester->xNotified.value();}); @@ -214,7 +189,7 @@ void PropertyBenchmark::cppNotifyingReadOnce() QCOMPARE(tester->property("yNotified").toInt(), i); } -void PropertyBenchmark::cppNotifyingDirectReadOnce() +void tst_QProperty::cppNotifyingDirectReadOnce() { QScopedPointer<PropertyTester> tester {new PropertyTester}; tester->yNotified.setBinding([&](){return tester->xNotified.value();}); @@ -227,5 +202,6 @@ void PropertyBenchmark::cppNotifyingDirectReadOnce() QCOMPARE(tester->yNotified.value(), i); } -QTEST_MAIN(PropertyBenchmark) -#include "main.moc" +QTEST_MAIN(tst_QProperty) + +#include "tst_bench_qproperty.moc" diff --git a/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/CMakeLists.txt b/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/CMakeLists.txt index 5ba14e43a2..22e04d98a2 100644 --- a/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/CMakeLists.txt +++ b/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qtimer_vs_qmetaobject.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## qtimer_vs_qmetaobject Binary: @@ -9,9 +10,6 @@ qt_internal_add_benchmark(qtimer_vs_qmetaobject tst_qtimer_vs_qmetaobject.cpp INCLUDE_DIRECTORIES . - PUBLIC_LIBRARIES + LIBRARIES Qt::Test ) - -#### Keys ignored in scope 1:.:.:qtimer_vs_qmetaobject.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/tst_qtimer_vs_qmetaobject.cpp b/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/tst_qtimer_vs_qmetaobject.cpp index 52a726b292..d0b3e21772 100644 --- a/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/tst_qtimer_vs_qmetaobject.cpp +++ b/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/tst_qtimer_vs_qmetaobject.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QtCore> #include <QTest> @@ -126,13 +101,9 @@ void qtimer_vs_qmetaobject::bench_data() void qtimer_vs_qmetaobject::benchBackgroundThread() { -#if !QT_CONFIG(cxx11_future) - QSKIP("This test requires QThread::create"); -#else QScopedPointer<QThread> thread(QThread::create([this]() { bench(); })); thread->start(); QVERIFY(thread->wait()); -#endif } QTEST_MAIN(qtimer_vs_qmetaobject) diff --git a/tests/benchmarks/corelib/kernel/qvariant/CMakeLists.txt b/tests/benchmarks/corelib/kernel/qvariant/CMakeLists.txt index 418fd1da9f..07978956b1 100644 --- a/tests/benchmarks/corelib/kernel/qvariant/CMakeLists.txt +++ b/tests/benchmarks/corelib/kernel/qvariant/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qvariant.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qvariant Binary: @@ -6,16 +7,15 @@ qt_internal_add_benchmark(tst_bench_qvariant SOURCES - tst_qvariant.cpp - PUBLIC_LIBRARIES - Qt::Gui + tst_bench_qvariant.cpp + LIBRARIES Qt::Test ) ## Scopes: ##################################################################### -qt_internal_extend_target(tst_bench_qvariant CONDITION NOT TARGET Qt::Gui - PUBLIC_LIBRARIES - # Remove: gui +qt_internal_extend_target(tst_bench_qvariant CONDITION TARGET Qt::Gui + LIBRARIES + Qt::Gui ) diff --git a/tests/benchmarks/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/benchmarks/corelib/kernel/qvariant/tst_bench_qvariant.cpp index f2618f7813..8b2e10c125 100644 --- a/tests/benchmarks/corelib/kernel/qvariant/tst_qvariant.cpp +++ b/tests/benchmarks/corelib/kernel/qvariant/tst_bench_qvariant.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QtCore> #ifdef QT_GUI_LIB @@ -34,7 +9,7 @@ #define ITERATION_COUNT 1e5 -class tst_qvariant : public QObject +class tst_QVariant : public QObject { Q_OBJECT @@ -107,7 +82,7 @@ Q_DECLARE_TYPEINFO(SmallClass, Q_RELOCATABLE_TYPE); QT_END_NAMESPACE Q_DECLARE_METATYPE(SmallClass); -void tst_qvariant::testBound() +void tst_QVariant::testBound() { qreal d = qreal(.5); QBENCHMARK { @@ -148,7 +123,7 @@ void variantCreation<SmallClass>(SmallClass val) } template <> -void variantCreation<tst_qvariant::ABenchmarkEnum>(tst_qvariant::ABenchmarkEnum val) +void variantCreation<tst_QVariant::ABenchmarkEnum>(tst_QVariant::ABenchmarkEnum val) { QBENCHMARK { for (int i = 0; i < ITERATION_COUNT; ++i) { @@ -158,49 +133,49 @@ void variantCreation<tst_qvariant::ABenchmarkEnum>(tst_qvariant::ABenchmarkEnum } -void tst_qvariant::doubleVariantCreation() +void tst_QVariant::doubleVariantCreation() { variantCreation<double>(0.0); } -void tst_qvariant::floatVariantCreation() +void tst_QVariant::floatVariantCreation() { variantCreation<float>(0.0f); } -void tst_qvariant::rectVariantCreation() +void tst_QVariant::rectVariantCreation() { variantCreation<QRect>(QRect(1, 2, 3, 4)); } -void tst_qvariant::stringVariantCreation() +void tst_QVariant::stringVariantCreation() { variantCreation<QString>(QString()); } #ifdef QT_GUI_LIB -void tst_qvariant::pixmapVariantCreation() +void tst_QVariant::pixmapVariantCreation() { variantCreation<QPixmap>(QPixmap()); } #endif -void tst_qvariant::stringListVariantCreation() +void tst_QVariant::stringListVariantCreation() { variantCreation<QStringList>(QStringList()); } -void tst_qvariant::bigClassVariantCreation() +void tst_QVariant::bigClassVariantCreation() { variantCreation<BigClass>(BigClass()); } -void tst_qvariant::smallClassVariantCreation() +void tst_QVariant::smallClassVariantCreation() { variantCreation<SmallClass>(SmallClass()); } -void tst_qvariant::enumVariantCreation() +void tst_QVariant::enumVariantCreation() { variantCreation<ABenchmarkEnum>(FirstEnumValue); } @@ -217,42 +192,42 @@ static void variantSetValue(T d) } } -void tst_qvariant::doubleVariantSetValue() +void tst_QVariant::doubleVariantSetValue() { variantSetValue<double>(0.0); } -void tst_qvariant::floatVariantSetValue() +void tst_QVariant::floatVariantSetValue() { variantSetValue<float>(0.0f); } -void tst_qvariant::rectVariantSetValue() +void tst_QVariant::rectVariantSetValue() { variantSetValue<QRect>(QRect()); } -void tst_qvariant::stringVariantSetValue() +void tst_QVariant::stringVariantSetValue() { variantSetValue<QString>(QString()); } -void tst_qvariant::stringListVariantSetValue() +void tst_QVariant::stringListVariantSetValue() { variantSetValue<QStringList>(QStringList()); } -void tst_qvariant::bigClassVariantSetValue() +void tst_QVariant::bigClassVariantSetValue() { variantSetValue<BigClass>(BigClass()); } -void tst_qvariant::smallClassVariantSetValue() +void tst_QVariant::smallClassVariantSetValue() { variantSetValue<SmallClass>(SmallClass()); } -void tst_qvariant::enumVariantSetValue() +void tst_QVariant::enumVariantSetValue() { variantSetValue<ABenchmarkEnum>(FirstEnumValue); } @@ -268,32 +243,32 @@ static void variantAssignment(T d) } } -void tst_qvariant::doubleVariantAssignment() +void tst_QVariant::doubleVariantAssignment() { variantAssignment<double>(0.0); } -void tst_qvariant::floatVariantAssignment() +void tst_QVariant::floatVariantAssignment() { variantAssignment<float>(0.0f); } -void tst_qvariant::rectVariantAssignment() +void tst_QVariant::rectVariantAssignment() { variantAssignment<QRect>(QRect()); } -void tst_qvariant::stringVariantAssignment() +void tst_QVariant::stringVariantAssignment() { variantAssignment<QString>(QString()); } -void tst_qvariant::stringListVariantAssignment() +void tst_QVariant::stringListVariantAssignment() { variantAssignment<QStringList>(QStringList()); } -void tst_qvariant::doubleVariantValue() +void tst_QVariant::doubleVariantValue() { QVariant v(0.0); QBENCHMARK { @@ -303,7 +278,7 @@ void tst_qvariant::doubleVariantValue() } } -void tst_qvariant::floatVariantValue() +void tst_QVariant::floatVariantValue() { QVariant v(0.0f); QBENCHMARK { @@ -313,7 +288,7 @@ void tst_qvariant::floatVariantValue() } } -void tst_qvariant::rectVariantValue() +void tst_QVariant::rectVariantValue() { QVariant v(QRect(1,2,3,4)); QBENCHMARK { @@ -323,7 +298,7 @@ void tst_qvariant::rectVariantValue() } } -void tst_qvariant::stringVariantValue() +void tst_QVariant::stringVariantValue() { QVariant v = QString(); QBENCHMARK { @@ -333,7 +308,7 @@ void tst_qvariant::stringVariantValue() } } -void tst_qvariant::createCoreType_data() +void tst_QVariant::createCoreType_data() { QTest::addColumn<int>("typeId"); for (int i = QMetaType::FirstCoreType; i <= QMetaType::LastCoreType; ++i) { @@ -346,7 +321,7 @@ void tst_qvariant::createCoreType_data() // QVariant. The purpose of this benchmark is to measure the overhead // of creating (and destroying) a QVariant compared to creating the // type directly. -void tst_qvariant::createCoreType() +void tst_QVariant::createCoreType() { QFETCH(int, typeId); QBENCHMARK { @@ -355,7 +330,7 @@ void tst_qvariant::createCoreType() } } -void tst_qvariant::createCoreTypeCopy_data() +void tst_QVariant::createCoreTypeCopy_data() { createCoreType_data(); } @@ -364,7 +339,7 @@ void tst_qvariant::createCoreTypeCopy_data() // QVariant. The purpose of this benchmark is to measure the overhead // of creating (and destroying) a QVariant compared to creating the // type directly. -void tst_qvariant::createCoreTypeCopy() +void tst_QVariant::createCoreTypeCopy() { QFETCH(int, typeId); QMetaType metaType(typeId); @@ -376,6 +351,6 @@ void tst_qvariant::createCoreTypeCopy() } } -QTEST_MAIN(tst_qvariant) +QTEST_MAIN(tst_QVariant) -#include "tst_qvariant.moc" +#include "tst_bench_qvariant.moc" diff --git a/tests/benchmarks/corelib/kernel/qwineventnotifier/CMakeLists.txt b/tests/benchmarks/corelib/kernel/qwineventnotifier/CMakeLists.txt index a581b1eaef..e78d3250bc 100644 --- a/tests/benchmarks/corelib/kernel/qwineventnotifier/CMakeLists.txt +++ b/tests/benchmarks/corelib/kernel/qwineventnotifier/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qwineventnotifier.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qwineventnotifier Binary: @@ -6,10 +7,7 @@ qt_internal_add_benchmark(tst_bench_qwineventnotifier SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qwineventnotifier.cpp + LIBRARIES Qt::Test ) - -#### Keys ignored in scope 1:.:.:qwineventnotifier.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/kernel/qwineventnotifier/main.cpp b/tests/benchmarks/corelib/kernel/qwineventnotifier/tst_bench_qwineventnotifier.cpp index 926ed5acdb..b1f87eabed 100644 --- a/tests/benchmarks/corelib/kernel/qwineventnotifier/main.cpp +++ b/tests/benchmarks/corelib/kernel/qwineventnotifier/tst_bench_qwineventnotifier.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2020 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2020 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QTest> #include <QtCore/qglobal.h> @@ -34,7 +9,7 @@ #include <QtCore/qelapsedtimer.h> #include <QtCore/qt_windows.h> -class QWinEventNotifierBenchmark : public QObject +class tst_QWinEventNotifier : public QObject { Q_OBJECT @@ -102,7 +77,7 @@ protected: int numberOfIterations; }; -void QWinEventNotifierBenchmark::waves_data() +void tst_QWinEventNotifier::waves_data() { QTest::addColumn<int>("waves"); QTest::addColumn<int>("notifiers"); @@ -112,7 +87,7 @@ void QWinEventNotifierBenchmark::waves_data() } } -void QWinEventNotifierBenchmark::waves() +void tst_QWinEventNotifier::waves() { QFETCH(int, waves); QFETCH(int, notifiers); @@ -131,6 +106,6 @@ void QWinEventNotifierBenchmark::waves() emit factory.stop(); } -QTEST_MAIN(QWinEventNotifierBenchmark) +QTEST_MAIN(tst_QWinEventNotifier) -#include "main.moc" +#include "tst_bench_qwineventnotifier.moc" diff --git a/tests/benchmarks/corelib/mimetypes/CMakeLists.txt b/tests/benchmarks/corelib/mimetypes/CMakeLists.txt index c825780e69..f66834de23 100644 --- a/tests/benchmarks/corelib/mimetypes/CMakeLists.txt +++ b/tests/benchmarks/corelib/mimetypes/CMakeLists.txt @@ -1,3 +1,4 @@ -# Generated from mimetypes.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause add_subdirectory(qmimedatabase) diff --git a/tests/benchmarks/corelib/mimetypes/qmimedatabase/CMakeLists.txt b/tests/benchmarks/corelib/mimetypes/qmimedatabase/CMakeLists.txt index 7adc043639..3d4eb7b46f 100644 --- a/tests/benchmarks/corelib/mimetypes/qmimedatabase/CMakeLists.txt +++ b/tests/benchmarks/corelib/mimetypes/qmimedatabase/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qmimedatabase.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qmimedatabase Binary: @@ -6,7 +7,7 @@ qt_internal_add_benchmark(tst_bench_qmimedatabase SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qmimedatabase.cpp + LIBRARIES Qt::Test ) diff --git a/tests/benchmarks/corelib/mimetypes/qmimedatabase/files/N.tar.gz b/tests/benchmarks/corelib/mimetypes/qmimedatabase/files/N.tar.gz Binary files differnew file mode 100644 index 0000000000..0a710447a5 --- /dev/null +++ b/tests/benchmarks/corelib/mimetypes/qmimedatabase/files/N.tar.gz diff --git a/tests/benchmarks/corelib/mimetypes/qmimedatabase/files/X b/tests/benchmarks/corelib/mimetypes/qmimedatabase/files/X new file mode 100644 index 0000000000..a84546e5bc --- /dev/null +++ b/tests/benchmarks/corelib/mimetypes/qmimedatabase/files/X @@ -0,0 +1 @@ +#include <math.h> diff --git a/tests/benchmarks/corelib/mimetypes/qmimedatabase/files/t.c b/tests/benchmarks/corelib/mimetypes/qmimedatabase/files/t.c new file mode 100644 index 0000000000..3774c48f13 --- /dev/null +++ b/tests/benchmarks/corelib/mimetypes/qmimedatabase/files/t.c @@ -0,0 +1 @@ +void x(); diff --git a/tests/benchmarks/corelib/mimetypes/qmimedatabase/files/u.txt b/tests/benchmarks/corelib/mimetypes/qmimedatabase/files/u.txt new file mode 100644 index 0000000000..8d45724eff --- /dev/null +++ b/tests/benchmarks/corelib/mimetypes/qmimedatabase/files/u.txt @@ -0,0 +1,4 @@ +foo +bar +- +_ diff --git a/tests/benchmarks/corelib/mimetypes/qmimedatabase/files/y b/tests/benchmarks/corelib/mimetypes/qmimedatabase/files/y new file mode 100644 index 0000000000..399593b6ce --- /dev/null +++ b/tests/benchmarks/corelib/mimetypes/qmimedatabase/files/y @@ -0,0 +1 @@ +diff --git a/plugins/patchreview/kdevpatchreview.json b/plugins/patchreview/kdevpatchreview.json diff --git a/tests/benchmarks/corelib/mimetypes/qmimedatabase/files/z b/tests/benchmarks/corelib/mimetypes/qmimedatabase/files/z Binary files differnew file mode 100644 index 0000000000..d1ed8a45d1 --- /dev/null +++ b/tests/benchmarks/corelib/mimetypes/qmimedatabase/files/z diff --git a/tests/benchmarks/corelib/mimetypes/qmimedatabase/main.cpp b/tests/benchmarks/corelib/mimetypes/qmimedatabase/main.cpp deleted file mode 100644 index 900e7028a4..0000000000 --- a/tests/benchmarks/corelib/mimetypes/qmimedatabase/main.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QTest> -#include <QMimeDatabase> - -class tst_QMimeDatabase: public QObject -{ - - Q_OBJECT - -private slots: - void inheritsPerformance(); - void benchMimeTypeForName(); -}; - -void tst_QMimeDatabase::inheritsPerformance() -{ - // Check performance of inherits(). - // This benchmark (which started in 2009 in kmimetypetest.cpp) uses 40 mimetypes. - QStringList mimeTypes; - mimeTypes << QLatin1String("image/jpeg") << QLatin1String("image/png") << QLatin1String("image/tiff") << QLatin1String("text/plain") << QLatin1String("text/html"); - mimeTypes += mimeTypes; - mimeTypes += mimeTypes; - mimeTypes += mimeTypes; - QCOMPARE(mimeTypes.count(), 40); - QMimeDatabase db; - QMimeType mime = db.mimeTypeForName(QString::fromLatin1("text/x-chdr")); - QVERIFY(mime.isValid()); - QBENCHMARK { - QString match; - foreach (const QString &mt, mimeTypes) { - if (mime.inherits(mt)) { - match = mt; - // of course there would normally be a "break" here, but we're testing worse-case - // performance here - } - } - QCOMPARE(match, QString::fromLatin1("text/plain")); - } - // Numbers from 2011, in release mode: - // KDE 4.7 numbers: 0.21 msec / 494,000 ticks / 568,345 instr. loads per iteration - // QMimeBinaryProvider (with Qt 5): 0.16 msec / NA / 416,049 instr. reads per iteration - // QMimeXmlProvider (with Qt 5): 0.062 msec / NA / 172,889 instr. reads per iteration - // (but the startup time is way higher) - // And memory usage is flat at 200K with QMimeBinaryProvider, while it peaks at 6 MB when - // parsing XML, and then keeps being around 4.5 MB for all the in-memory hashes. -} - -void tst_QMimeDatabase::benchMimeTypeForName() -{ - QMimeDatabase db; - - QBENCHMARK { - const auto s = db.mimeTypeForName(QStringLiteral("text/plain")); - QVERIFY(s.isValid()); - } -} - -QTEST_MAIN(tst_QMimeDatabase) -#include "main.moc" diff --git a/tests/benchmarks/corelib/mimetypes/qmimedatabase/tst_bench_qmimedatabase.cpp b/tests/benchmarks/corelib/mimetypes/qmimedatabase/tst_bench_qmimedatabase.cpp new file mode 100644 index 0000000000..ffc65e7949 --- /dev/null +++ b/tests/benchmarks/corelib/mimetypes/qmimedatabase/tst_bench_qmimedatabase.cpp @@ -0,0 +1,146 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// Copyright (C) 2021 Igor Kushnir <igorkuo@gmail.com> +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QTest> +#include <QMimeDatabase> + +using namespace Qt::StringLiterals; + +namespace { +struct MatchModeInfo +{ + QMimeDatabase::MatchMode mode; + const char *name; +}; + +constexpr MatchModeInfo matchModes[] = { { QMimeDatabase::MatchDefault, "Default" }, + { QMimeDatabase::MatchExtension, "Extension" }, + { QMimeDatabase::MatchContent, "Content" } }; + +void addFileRows(const char *tag, const QString &fileName, const QStringList &expectedMimeNames) +{ + QCOMPARE(static_cast<std::size_t>(expectedMimeNames.size()), std::size(matchModes)); + for (int i = 0; i < expectedMimeNames.size(); ++i) { + QTest::addRow(qPrintable(tag + QStringLiteral(" - %s")), matchModes[i].name) + << fileName << matchModes[i].mode << expectedMimeNames[i]; + } +} + +void addExistentFileRows(const char *tag, const QString &fileName, + const QStringList &expectedMimeNames) +{ + const QString filePath = QFINDTESTDATA("files/" + fileName); + QVERIFY2(!filePath.isEmpty(), + qPrintable(QStringLiteral("Cannot find test file %1 in files/").arg(fileName))); + addFileRows(tag, filePath, expectedMimeNames); +} +} + +class tst_QMimeDatabase: public QObject +{ + + Q_OBJECT + +private slots: + void inheritsPerformance(); + void benchMimeTypeForName(); + void benchMimeTypeForFile_data(); + void benchMimeTypeForFile(); +}; + +void tst_QMimeDatabase::inheritsPerformance() +{ + // Check performance of inherits(). + // This benchmark (which started in 2009 in kmimetypetest.cpp) uses 40 mimetypes. + // (eight groups of five unique ones) + const QString uniqueMimeTypes[] = { + u"image/jpeg"_s, + u"image/png"_s, + u"image/tiff"_s, + u"text/plain"_s, + u"text/html"_s, + }; + constexpr size_t NumOuterLoops = 40 / std::size(uniqueMimeTypes); + QMimeDatabase db; + const QMimeType mime = db.mimeTypeForName(u"text/x-chdr"_s); + QVERIFY(mime.isValid()); + QString match; + QBENCHMARK { + for (size_t i = 0; i < NumOuterLoops; ++i) { + for (const QString &mt : uniqueMimeTypes) { + if (mime.inherits(mt)) { + match = mt; + // of course there would normally be a "break" here, but + // we're testing worse-case performance here + } + } + } + } + QCOMPARE(match, u"text/plain"_s); + // Numbers from 2011, in release mode: + // KDE 4.7 numbers: 0.21 msec / 494,000 ticks / 568,345 instr. loads per iteration + // QMimeBinaryProvider (with Qt 5): 0.16 msec / NA / 416,049 instr. reads per iteration + // QMimeXmlProvider (with Qt 5): 0.062 msec / NA / 172,889 instr. reads per iteration + // (but the startup time is way higher) + // And memory usage is flat at 200K with QMimeBinaryProvider, while it peaks at 6 MB when + // parsing XML, and then keeps being around 4.5 MB for all the in-memory hashes. +} + +void tst_QMimeDatabase::benchMimeTypeForName() +{ + QMimeDatabase db; + + QBENCHMARK { + const auto s = db.mimeTypeForName(QStringLiteral("text/plain")); + QVERIFY(s.isValid()); + } +} + +void tst_QMimeDatabase::benchMimeTypeForFile_data() +{ + QTest::addColumn<QString>("fileName"); + QTest::addColumn<QMimeDatabase::MatchMode>("mode"); + QTest::addColumn<QString>("expectedMimeName"); + + addFileRows("archive", "a.tar.gz", + { "application/x-compressed-tar", + "application/x-compressed-tar", + "application/octet-stream" }); + addFileRows("OpenDocument Text", "b.odt", + { "application/vnd.oasis.opendocument.text", + "application/vnd.oasis.opendocument.text", + "application/octet-stream" }); + + addExistentFileRows( + "existent archive with extension", "N.tar.gz", + { "application/x-compressed-tar", "application/x-compressed-tar", "application/gzip" }); + addExistentFileRows("existent C with extension", "t.c", + { "text/x-csrc", "text/x-csrc", "text/plain" }); + addExistentFileRows("existent text file with extension", "u.txt", + { "text/plain", "text/plain", "text/plain" }); + addExistentFileRows("existent C w/o extension", "X", + { "text/x-csrc", "application/octet-stream", "text/x-csrc" }); + addExistentFileRows("existent patch w/o extension", "y", + { "text/x-patch", "application/octet-stream", "text/x-patch" }); + addExistentFileRows("existent archive w/o extension", "z", + { "application/gzip", "application/octet-stream", "application/gzip" }); +} + +void tst_QMimeDatabase::benchMimeTypeForFile() +{ + QFETCH(const QString, fileName); + QFETCH(const QMimeDatabase::MatchMode, mode); + QFETCH(const QString, expectedMimeName); + + QMimeDatabase db; + + QBENCHMARK { + const auto mimeType = db.mimeTypeForFile(fileName, mode); + QCOMPARE(mimeType.name(), expectedMimeName); + } +} + +QTEST_MAIN(tst_QMimeDatabase) + +#include "tst_bench_qmimedatabase.moc" diff --git a/tests/benchmarks/corelib/plugin/CMakeLists.txt b/tests/benchmarks/corelib/plugin/CMakeLists.txt index 3ae12b23f5..fdfc6d8b8c 100644 --- a/tests/benchmarks/corelib/plugin/CMakeLists.txt +++ b/tests/benchmarks/corelib/plugin/CMakeLists.txt @@ -1,3 +1,4 @@ -# Generated from plugin.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause add_subdirectory(quuid) diff --git a/tests/benchmarks/corelib/plugin/quuid/CMakeLists.txt b/tests/benchmarks/corelib/plugin/quuid/CMakeLists.txt index 3b787dc8e8..2c394b2bb2 100644 --- a/tests/benchmarks/corelib/plugin/quuid/CMakeLists.txt +++ b/tests/benchmarks/corelib/plugin/quuid/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from quuid.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_quuid Binary: @@ -6,10 +7,7 @@ qt_internal_add_benchmark(tst_bench_quuid SOURCES - tst_quuid.cpp - PUBLIC_LIBRARIES + tst_bench_quuid.cpp + LIBRARIES Qt::Test ) - -#### Keys ignored in scope 1:.:.:quuid.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp b/tests/benchmarks/corelib/plugin/quuid/tst_bench_quuid.cpp index 0bc0a7de93..7a6da7f84c 100644 --- a/tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp +++ b/tests/benchmarks/corelib/plugin/quuid/tst_bench_quuid.cpp @@ -1,43 +1,14 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QtCore/QCoreApplication> #include <QtCore/QUuid> #include <QTest> -class tst_bench_QUuid : public QObject +class tst_QUuid : public QObject { Q_OBJECT -public: - tst_bench_QUuid() - { } - private slots: void createUuid(); void fromChar(); @@ -56,29 +27,29 @@ private slots: void operatorMore(); }; -void tst_bench_QUuid::createUuid() +void tst_QUuid::createUuid() { QBENCHMARK { - QUuid::createUuid(); + [[maybe_unused]] auto r = QUuid::createUuid(); } } -void tst_bench_QUuid::fromChar() +void tst_QUuid::fromChar() { QBENCHMARK { QUuid uuid("{67C8770B-44F1-410A-AB9A-F9B5446F13EE}"); } } -void tst_bench_QUuid::toString() +void tst_QUuid::toString() { QUuid uuid = QUuid::createUuid(); QBENCHMARK { - uuid.toString(); + [[maybe_unused]] auto r = uuid.toString(); } } -void tst_bench_QUuid::fromString() +void tst_QUuid::fromString() { QString string = "{67C8770B-44F1-410A-AB9A-F9B5446F13EE}"; QBENCHMARK { @@ -86,15 +57,15 @@ void tst_bench_QUuid::fromString() } } -void tst_bench_QUuid::toByteArray() +void tst_QUuid::toByteArray() { QUuid uuid = QUuid::createUuid(); QBENCHMARK { - uuid.toByteArray(); + [[maybe_unused]] auto r = uuid.toByteArray(); } } -void tst_bench_QUuid::fromByteArray() +void tst_QUuid::fromByteArray() { QByteArray string = "{67C8770B-44F1-410A-AB9A-F9B5446F13EE}"; QBENCHMARK { @@ -102,15 +73,15 @@ void tst_bench_QUuid::fromByteArray() } } -void tst_bench_QUuid::toRfc4122() +void tst_QUuid::toRfc4122() { QUuid uuid = QUuid::createUuid(); QBENCHMARK { - uuid.toRfc4122(); + [[maybe_unused]] auto r = uuid.toRfc4122(); } } -void tst_bench_QUuid::fromRfc4122() +void tst_QUuid::fromRfc4122() { QByteArray string = QByteArray::fromHex("67C8770B44F1410AAB9AF9B5446F13EE"); QBENCHMARK { @@ -119,7 +90,7 @@ void tst_bench_QUuid::fromRfc4122() } } -void tst_bench_QUuid::createUuidV3() +void tst_QUuid::createUuidV3() { QUuid ns = QUuid::createUuid(); QByteArray name = QByteArray("Test"); @@ -129,7 +100,7 @@ void tst_bench_QUuid::createUuidV3() } } -void tst_bench_QUuid::createUuidV5() +void tst_QUuid::createUuidV5() { QUuid ns = QUuid::createUuid(); QByteArray name = QByteArray("Test"); @@ -139,7 +110,7 @@ void tst_bench_QUuid::createUuidV5() } } -void tst_bench_QUuid::toDataStream() +void tst_QUuid::toDataStream() { QUuid uuid = QUuid::createUuid(); QByteArray ar; @@ -151,7 +122,7 @@ void tst_bench_QUuid::toDataStream() } } -void tst_bench_QUuid::fromDataStream() +void tst_QUuid::fromDataStream() { QUuid uuid1, uuid2; uuid1 = QUuid::createUuid(); @@ -168,33 +139,34 @@ void tst_bench_QUuid::fromDataStream() } } -void tst_bench_QUuid::isNull() +void tst_QUuid::isNull() { QUuid uuid = QUuid(); QBENCHMARK { - uuid.isNull(); + [[maybe_unused]] auto r = uuid.isNull(); } } -void tst_bench_QUuid::operatorLess() +void tst_QUuid::operatorLess() { QUuid uuid1, uuid2; uuid1 = QUuid::createUuid(); uuid2 = QUuid::createUuid(); QBENCHMARK { - uuid1 < uuid2; + [[maybe_unused]] auto r = uuid1 < uuid2; } } -void tst_bench_QUuid::operatorMore() +void tst_QUuid::operatorMore() { QUuid uuid1, uuid2; uuid1 = QUuid::createUuid(); uuid2 = QUuid::createUuid(); QBENCHMARK { - uuid1 > uuid2; + [[maybe_unused]] auto r = uuid1 > uuid2; } } -QTEST_MAIN(tst_bench_QUuid); -#include "tst_quuid.moc" +QTEST_MAIN(tst_QUuid) + +#include "tst_bench_quuid.moc" diff --git a/tests/benchmarks/corelib/serialization/CMakeLists.txt b/tests/benchmarks/corelib/serialization/CMakeLists.txt new file mode 100644 index 0000000000..98343d7688 --- /dev/null +++ b/tests/benchmarks/corelib/serialization/CMakeLists.txt @@ -0,0 +1,4 @@ +# Copyright (C) 2023 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +add_subdirectory(qcborvalue) diff --git a/tests/benchmarks/corelib/serialization/qcborvalue/CMakeLists.txt b/tests/benchmarks/corelib/serialization/qcborvalue/CMakeLists.txt new file mode 100644 index 0000000000..6ada5b983d --- /dev/null +++ b/tests/benchmarks/corelib/serialization/qcborvalue/CMakeLists.txt @@ -0,0 +1,10 @@ +# Copyright (C) 2023 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +qt_internal_add_benchmark(tst_bench_qcborvalue + SOURCES + tst_bench_qcborvalue.cpp + LIBRARIES + Qt::Core + Qt::Test +) diff --git a/tests/benchmarks/corelib/serialization/qcborvalue/tst_bench_qcborvalue.cpp b/tests/benchmarks/corelib/serialization/qcborvalue/tst_bench_qcborvalue.cpp new file mode 100644 index 0000000000..b9978fa25c --- /dev/null +++ b/tests/benchmarks/corelib/serialization/qcborvalue/tst_bench_qcborvalue.cpp @@ -0,0 +1,95 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QCborMap> +#include <QCborValue> + +#include <QTest> + +template <typename Char> +struct SampleStrings +{ + static constexpr char key[] = "hello"; +}; + +template <> +struct SampleStrings<char16_t> +{ + static constexpr char16_t key[] = u"hello"; +}; + +template <> +struct SampleStrings<QChar> +{ + static const QChar *const key; +}; +const QChar *const SampleStrings<QChar>::key = + reinterpret_cast<const QChar *>(SampleStrings<char16_t>::key); + +template <typename T, typename = void> +constexpr bool hasValueType = false; + +template <typename T> +constexpr bool hasValueType<T, std::void_t<typename T::value_type>> = true; + +class tst_QCborValue : public QObject +{ + Q_OBJECT +private: + template <typename Type> + void doKeyLookup(); + + template <typename Type> + void doConstruct(); + +private slots: + void keyLookupLatin1() { doKeyLookup<QLatin1StringView>(); } + void keyLookupString() { doKeyLookup<QString>(); } + void keyLookupConstCharPtr() { doKeyLookup<char>(); }; + + void constructLatin1() { doConstruct<QLatin1StringView>(); } + void constructString() { doConstruct<QString>(); } + void constructStringView() { doConstruct<QStringView>(); } + void constructConstCharPtr() { doConstruct<char>(); } +}; + +template <typename Type> +void tst_QCborValue::doKeyLookup() +{ + const QCborMap m{{"hello", "world"}, {1, 2}}; + const QCborValue v = m; + + if constexpr (hasValueType<Type>) { + using Char = std::remove_cv_t<typename Type::value_type>; + using Strings = SampleStrings<Char>; + const Type s(Strings::key); + QBENCHMARK { + [[maybe_unused]] const QCborValue r = v[s]; + } + } else { + QBENCHMARK { + [[maybe_unused]] const QCborValue r = v[SampleStrings<Type>::key]; + } + } +} + +template<typename Type> +void tst_QCborValue::doConstruct() +{ + if constexpr (hasValueType<Type>) { + using Char = std::remove_cv_t<typename Type::value_type>; + using Strings = SampleStrings<Char>; + const Type s(Strings::key); + QBENCHMARK { + [[maybe_unused]] const auto v = QCborValue{s}; + } + } else { + QBENCHMARK { + [[maybe_unused]] const auto v = QCborValue{SampleStrings<Type>::key}; + } + } +} + +QTEST_MAIN(tst_QCborValue) + +#include "tst_bench_qcborvalue.moc" diff --git a/tests/benchmarks/corelib/text/CMakeLists.txt b/tests/benchmarks/corelib/text/CMakeLists.txt index 8942b898d0..303aa51def 100644 --- a/tests/benchmarks/corelib/text/CMakeLists.txt +++ b/tests/benchmarks/corelib/text/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from text.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause add_subdirectory(qbytearray) add_subdirectory(qchar) @@ -7,6 +8,5 @@ add_subdirectory(qstringbuilder) add_subdirectory(qstringlist) add_subdirectory(qstringtokenizer) add_subdirectory(qregularexpression) -if(GCC) - add_subdirectory(qstring) -endif() +add_subdirectory(qstring) +add_subdirectory(qutf8stringview) diff --git a/tests/benchmarks/corelib/text/qbytearray/CMakeLists.txt b/tests/benchmarks/corelib/text/qbytearray/CMakeLists.txt index 50574aa221..1ea3660680 100644 --- a/tests/benchmarks/corelib/text/qbytearray/CMakeLists.txt +++ b/tests/benchmarks/corelib/text/qbytearray/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qbytearray.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qbytearray Binary: @@ -6,11 +7,7 @@ qt_internal_add_benchmark(tst_bench_qbytearray SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qbytearray.cpp + LIBRARIES Qt::Test ) - -#### Keys ignored in scope 1:.:.:qbytearray.pro:<TRUE>: -# TEMPLATE = "app" -# TESTDATA = "main.cpp" diff --git a/tests/benchmarks/corelib/text/qbytearray/main.cpp b/tests/benchmarks/corelib/text/qbytearray/tst_bench_qbytearray.cpp index e421e7436b..a97cba7c50 100644 --- a/tests/benchmarks/corelib/text/qbytearray/main.cpp +++ b/tests/benchmarks/corelib/text/qbytearray/tst_bench_qbytearray.cpp @@ -1,40 +1,15 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Copyright (C) 2016 Intel Corporation. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2021 The Qt Company Ltd. +// Copyright (C) 2016 Intel Corporation. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QDebug> #include <QIODevice> #include <QFile> #include <QString> #include <qtest.h> +#include <limits> - -class tst_qbytearray : public QObject +class tst_QByteArray : public QObject { Q_OBJECT QByteArray sourcecode; @@ -43,21 +18,32 @@ private slots: void append(); void append_data(); + void toLongLong_data(); + void toLongLong(); + void toULongLong_data(); + void toULongLong(); + void latin1Uppercasing_qt54(); void latin1Uppercasing_xlate(); void latin1Uppercasing_xlate_checked(); void latin1Uppercasing_category(); void latin1Uppercasing_bitcheck(); + + void toPercentEncoding_data(); + void toPercentEncoding(); + + void operator_assign_char(); + void operator_assign_char_data(); }; -void tst_qbytearray::initTestCase() +void tst_QByteArray::initTestCase() { - QFile self(QFINDTESTDATA("main.cpp")); + QFile self(QFINDTESTDATA("tst_bench_qbytearray.cpp")); QVERIFY(self.open(QIODevice::ReadOnly)); sourcecode = self.readAll(); } -void tst_qbytearray::append_data() +void tst_QByteArray::append_data() { QTest::addColumn<int>("size"); QTest::newRow("1") << int(1); @@ -71,7 +57,7 @@ void tst_qbytearray::append_data() QTest::newRow("100000000") << int(100000000); } -void tst_qbytearray::append() +void tst_QByteArray::append() { QFETCH(int, size); @@ -83,7 +69,90 @@ void tst_qbytearray::append() } } -void tst_qbytearray::latin1Uppercasing_qt54() +static QByteArray decNext(QByteArray big) +{ + // Increments a decimal digit-string (ignoring sign, so decrements if + // negative); only intended for taking a boundary value just out of range, + // so big is never a string of only 9s (that'd be one less than a power of + // ten, which cannot be a power of two, as odd, or one less than one, as the + // power of ten isn't a power of two). + int i = big.size() - 1; + while (big.at(i) == '9') + big[i--] = '0'; + big[i] += 1; + return big; +} + +void tst_QByteArray::toLongLong_data() +{ + QTest::addColumn<QByteArray>("text"); + QTest::addColumn<bool>("good"); + QTest::addColumn<qlonglong>("number"); +#define ROW(n) QTest::newRow(#n) << QByteArray(#n) << true << n ## LL + ROW(0); + ROW(1); + ROW(-1); + ROW(17); + ROW(-17); + ROW(1234567890); + ROW(-1234567890); +#undef ROW + using LL = std::numeric_limits<qlonglong>; + QTest::newRow("min") << QByteArray::number(LL::min()) << true << LL::min(); + QTest::newRow("min-1") << decNext(QByteArray::number(LL::min())) << false << 0LL; + QTest::newRow("max") << QByteArray::number(LL::max()) << true << LL::max(); + QTest::newRow("max+1") << decNext(QByteArray::number(LL::max())) << false << 0LL; +} + +void tst_QByteArray::toLongLong() +{ + QFETCH(QByteArray, text); + QFETCH(bool, good); + QFETCH(qlonglong, number); + + qlonglong actual = 0; + bool ok; + QBENCHMARK { + actual = text.toLongLong(&ok); + } + QCOMPARE(actual, number); + QCOMPARE(ok, good); +} + +void tst_QByteArray::toULongLong_data() +{ + QTest::addColumn<QByteArray>("text"); + QTest::addColumn<bool>("good"); + QTest::addColumn<qulonglong>("number"); +#define ROW(n) \ + QTest::newRow(#n) << QByteArray(#n) << true << n ## ULL; \ + QTest::newRow("-" #n) << QByteArray("-" #n) << false << 0ULL + ROW(0); + ROW(1); + ROW(17); + ROW(1234567890); +#undef ROW + using ULL = std::numeric_limits<qulonglong>; + QTest::newRow("max") << QByteArray::number(ULL::max()) << true << ULL::max(); + QTest::newRow("max+1") << decNext(QByteArray::number(ULL::max())) << false << 0ULL; +} + +void tst_QByteArray::toULongLong() +{ + QFETCH(QByteArray, text); + QFETCH(bool, good); + QFETCH(qulonglong, number); + + qulonglong actual = 0; + bool ok; + QBENCHMARK { + actual = text.toULongLong(&ok); + } + QCOMPARE(actual, number); + QCOMPARE(ok, good); +} + +void tst_QByteArray::latin1Uppercasing_qt54() { QByteArray s = sourcecode; s.detach(); @@ -132,7 +201,7 @@ static const uchar uppercased[256] = { 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf, 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xf7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xff }; -void tst_qbytearray::latin1Uppercasing_xlate() +void tst_QByteArray::latin1Uppercasing_xlate() { QByteArray output = sourcecode; output.detach(); @@ -146,7 +215,7 @@ void tst_qbytearray::latin1Uppercasing_xlate() } } -void tst_qbytearray::latin1Uppercasing_xlate_checked() +void tst_QByteArray::latin1Uppercasing_xlate_checked() { QByteArray output = sourcecode; output.detach(); @@ -199,7 +268,7 @@ static const char categories[256] = { 2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0 }; -void tst_qbytearray::latin1Uppercasing_category() +void tst_QByteArray::latin1Uppercasing_category() { QByteArray output = sourcecode; output.detach(); @@ -244,7 +313,7 @@ static bool bittest(const quint32 *data, uchar bit) return data[bit / bitsperelem] & (1 << (bit & (bitsperelem - 1))); } -void tst_qbytearray::latin1Uppercasing_bitcheck() +void tst_QByteArray::latin1Uppercasing_bitcheck() { QByteArray output = sourcecode; output.detach(); @@ -258,7 +327,67 @@ void tst_qbytearray::latin1Uppercasing_bitcheck() } } +void tst_QByteArray::toPercentEncoding_data() +{ + QTest::addColumn<QByteArray>("plaintext"); + QTest::addColumn<QByteArray>("expected"); + + QTest::newRow("empty") << QByteArray("") << QByteArray(""); + QTest::newRow("plain") + << QByteArray("the quick brown fox jumped over the lazy dogs") + << QByteArray("the%20quick%20brown%20fox%20jumped%20over%20the%20lazy%20dogs"); + QTest::newRow("specials") + << QByteArray( + "\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15" + "\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,/:;<=>?@[\\]^`{|}\x7f") + << QByteArray( + "%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18" + "%19%1A%1B%1C%1D%1E%1F%20%21%22%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3C" + "%3D%3E%3F%40%5B%5C%5D%5E%60%7B%7C%7D%7F"); +} + +void tst_QByteArray::toPercentEncoding() +{ + QFETCH(QByteArray, plaintext); + QByteArray encoded; + QBENCHMARK { + encoded = plaintext.toPercentEncoding(); + } + QTEST(encoded, "expected"); +} + +void tst_QByteArray::operator_assign_char() +{ + QFETCH(QByteArray, data); + QString str(data.size(), Qt::Uninitialized); + + const char *tdata = data.constData(); + QBENCHMARK { + str.operator=(tdata); + } +} + +void tst_QByteArray::operator_assign_char_data() +{ + QTest::addColumn<QByteArray>("data"); + + QByteArray data; + data.fill('a', 5); + QTest::newRow("length: 5") << data; + data.fill('b', 10); + QTest::newRow("length: 10") << data; + data.fill('c', 20); + QTest::newRow("length: 20") << data; + data.fill('d', 50); + QTest::newRow("length: 50") << data; + data.fill('e', 100); + QTest::newRow("length: 100") << data; + data.fill('f', 500); + QTest::newRow("length: 500") << data; + data.fill('g', 1'000); + QTest::newRow("length: 1'000") << data; +} -QTEST_MAIN(tst_qbytearray) +QTEST_MAIN(tst_QByteArray) -#include "main.moc" +#include "tst_bench_qbytearray.moc" diff --git a/tests/benchmarks/corelib/text/qchar/CMakeLists.txt b/tests/benchmarks/corelib/text/qchar/CMakeLists.txt index afdf96e9d4..136d3ef6fa 100644 --- a/tests/benchmarks/corelib/text/qchar/CMakeLists.txt +++ b/tests/benchmarks/corelib/text/qchar/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qchar.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qchar Binary: @@ -6,7 +7,7 @@ qt_internal_add_benchmark(tst_bench_qchar SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qchar.cpp + LIBRARIES Qt::Test ) diff --git a/tests/benchmarks/corelib/text/qchar/main.cpp b/tests/benchmarks/corelib/text/qchar/tst_bench_qchar.cpp index 746f9730f7..194dd27d36 100644 --- a/tests/benchmarks/corelib/text/qchar/main.cpp +++ b/tests/benchmarks/corelib/text/qchar/tst_bench_qchar.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QTest> #include <QChar> @@ -133,4 +108,4 @@ void tst_QChar::isSpace() QTEST_MAIN(tst_QChar) -#include "main.moc" +#include "tst_bench_qchar.moc" diff --git a/tests/benchmarks/corelib/text/qlocale/CMakeLists.txt b/tests/benchmarks/corelib/text/qlocale/CMakeLists.txt index 1c692af6c8..04c2f69b9f 100644 --- a/tests/benchmarks/corelib/text/qlocale/CMakeLists.txt +++ b/tests/benchmarks/corelib/text/qlocale/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qlocale.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qlocale Binary: @@ -6,7 +7,7 @@ qt_internal_add_benchmark(tst_bench_qlocale SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qlocale.cpp + LIBRARIES Qt::Test ) diff --git a/tests/benchmarks/corelib/text/qlocale/main.cpp b/tests/benchmarks/corelib/text/qlocale/tst_bench_qlocale.cpp index 887053ae4a..3d13174c9c 100644 --- a/tests/benchmarks/corelib/text/qlocale/main.cpp +++ b/tests/benchmarks/corelib/text/qlocale/tst_bench_qlocale.cpp @@ -1,34 +1,11 @@ -/**************************************************************************** -** -** Copyright (C) 2020 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2020 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QLocale> #include <QTest> +using namespace Qt::StringLiterals; + class tst_QLocale : public QObject { Q_OBJECT @@ -54,6 +31,12 @@ private Q_SLOTS: void toUpper_QLocale_2(); void toUpper_QString(); void number_QString(); + void toLongLong_data(); + void toLongLong(); + void toULongLong_data(); + void toULongLong(); + void toDouble_data(); + void toDouble(); }; static QString data() @@ -392,6 +375,219 @@ void tst_QLocale::number_QString() } } +template <typename Integer> +void toWholeCommon_data() +{ + QTest::addColumn<QString>("text"); + QTest::addColumn<QString>("locale"); + QTest::addColumn<bool>("good"); + QTest::addColumn<Integer>("expected"); + + QTest::newRow("C: empty") << u""_s << u"C"_s << false << Integer(0ull); + QTest::newRow("C: 0") << u"0"_s << u"C"_s << true << Integer(0ull); + QTest::newRow("C: 1234") << u"1234"_s << u"C"_s << true << Integer(1234ull); + // C locale omits grouping, but doesn't reject it. + QTest::newRow("C: 1,234") << u"1,234"_s << u"C"_s << true << Integer(1234ull); + QTest::newRow("C: 123456789") + << u"123456789"_s << u"C"_s << true << Integer(123456789ull); + QTest::newRow("C: 123,456,789") + << u"123,456,789"_s << u"C"_s << true << Integer(123456789ull); + + QTest::newRow("en: empty") << u""_s << u"en"_s << false << Integer(0ull); + QTest::newRow("en: 0") << u"0"_s << u"en"_s << true << Integer(0ull); + QTest::newRow("en: 1234") << u"1234"_s << u"en"_s << true << Integer(1234ull); + QTest::newRow("en: 1,234") << u"1,234"_s << u"en"_s << true << Integer(1234ull); + QTest::newRow("en: 123,456,789") + << u"123,456,789"_s << u"en"_s << true << Integer(123456789ull); + QTest::newRow("en: 123456789") + << u"123456789"_s << u"en"_s << true << Integer(123456789ull); + + QTest::newRow("de: empty") << u""_s << u"de"_s << false << Integer(0ull); + QTest::newRow("de: 0") << u"0"_s << u"de"_s << true << Integer(0ull); + QTest::newRow("de: 1234") << u"1234"_s << u"de"_s << true << Integer(1234ull); + QTest::newRow("de: 1.234") << u"1.234"_s << u"de"_s << true << Integer(1234ull); + QTest::newRow("de: 123.456.789") + << u"123.456.789"_s << u"de"_s << true << Integer(123456789ull); + QTest::newRow("de: 123456789") + << u"123456789"_s << u"de"_s << true << Integer(123456789ull); + + // Locales with non-single-character signs: + QTest::newRow("ar_EG: +403") // Arabic, Egypt + << u"\u061c+\u0664\u0660\u0663"_s << u"ar_EG"_s << true << Integer(403ull); + QTest::newRow("ar_EG: !403") // Only first character of the sign + << u"\u061c\u0664\u0660\u0663"_s << u"ar_EG"_s << false << Integer(0ull); + QTest::newRow("fa_IR: +403") // Farsi, Iran + << u"\u200e+\u06f4\u06f0\u06f3"_s << u"fa_IR"_s << true << Integer(403ull); + QTest::newRow("fa_IR: !403") // Only first character of sign + << u"\u200e\u06f4\u06f0\u06f3"_s << u"fa_IR"_s << false << Integer(0ull); +} + +void tst_QLocale::toLongLong_data() +{ + toWholeCommon_data<qlonglong>(); + + QTest::newRow("C: -1234") << u"-1234"_s << u"C"_s << true << -1234ll; + QTest::newRow("C: -123456789") << u"-123456789"_s << u"C"_s << true << -123456789ll; + QTest::newRow("C: qlonglong-max") + << u"9223372036854775807"_s << u"C"_s << true + << std::numeric_limits<qlonglong>::max(); + QTest::newRow("C: qlonglong-min") + << u"-9223372036854775808"_s << u"C"_s << true + << std::numeric_limits<qlonglong>::min(); + + // Locales with multi-character signs: + QTest::newRow("ar_EG: -403") // Arabic, Egypt + << u"\u061c-\u0664\u0660\u0663"_s << u"ar_EG"_s << true << -403ll; + QTest::newRow("fa_IR: -403") // Farsi, Iran + << u"\u200e\u2212\u06f4\u06f0\u06f3"_s << u"fa_IR"_s << true << -403ll; +} + +void tst_QLocale::toLongLong() +{ + QFETCH(QString, text); + QFETCH(QString, locale); + QFETCH(bool, good); + QFETCH(qlonglong, expected); + + const QLocale loc(locale); + qlonglong actual = expected; + bool ok = false; + QBENCHMARK { + actual = loc.toLongLong(text, &ok); + } + QCOMPARE(ok, good); + QCOMPARE(actual, expected); +} + +void tst_QLocale::toULongLong_data() +{ + toWholeCommon_data<qulonglong>(); + + QTest::newRow("C: qlonglong-max + 1") + << u"9223372036854775808"_s << u"C"_s << true + << (qulonglong(std::numeric_limits<qlonglong>::max()) + 1); + QTest::newRow("C: qulonglong-max") + << u"18446744073709551615"_s << u"C"_s << true + << std::numeric_limits<qulonglong>::max(); +} + +void tst_QLocale::toULongLong() +{ + QFETCH(QString, text); + QFETCH(QString, locale); + QFETCH(bool, good); + QFETCH(qulonglong, expected); + + const QLocale loc(locale); + qulonglong actual = expected; + bool ok = false; + QBENCHMARK { + actual = loc.toULongLong(text, &ok); + } + QCOMPARE(ok, good); + QCOMPARE(actual, expected); +} + + +void tst_QLocale::toDouble_data() +{ + QTest::addColumn<QString>("text"); + QTest::addColumn<QString>("locale"); + QTest::addColumn<bool>("good"); + QTest::addColumn<double>("expected"); + + QTest::newRow("C: empty") << u""_s << u"C"_s << false << 0.0; + QTest::newRow("C: 0") << u"0"_s << u"C"_s << true << 0.0; + QTest::newRow("C: 0.12340") << u"0.12340"_s << u"C"_s << true << 0.12340; + QTest::newRow("C: -0.12340") << u"-0.12340"_s << u"C"_s << true << -0.12340; + QTest::newRow("C: −0.12340") << u"\u2212" "0.12340"_s << u"C"_s << true << -0.12340; + QTest::newRow("C: 1.0e-4") << u"1.0e-4"_s << u"C"_s << true << 1.0e-4; + QTest::newRow("C: 1.0e−4") << u"1.0e\u2212" "4"_s << u"C"_s << true << 1.0e-4; + QTest::newRow("C: 1.0e+4") << u"1.0e+4"_s << u"C"_s << true << 1.0e+4; + QTest::newRow("C: 10.e+3") << u"10.e+3"_s << u"C"_s << true << 1.0e+4; + QTest::newRow("C: 10e+3.") << u"10e+3."_s << u"C"_s << false << 0.0; // exp...dot + QTest::newRow("C: 1e4") << u"1e4"_s << u"C"_s << true << 1.0e+4; + + // NaN and infinity: + QTest::newRow("C: nan") << u"nan"_s << u"C"_s << true << qQNaN(); + QTest::newRow("C: NaN") << u"NaN"_s << u"C"_s << true << qQNaN(); + QTest::newRow("C: -nan") << u"-nan"_s << u"C"_s << false << 0.0; + QTest::newRow("C: +nan") << u"+nan"_s << u"C"_s << false << 0.0; + QTest::newRow("C: inf") << u"inf"_s << u"C"_s << true << qInf(); + QTest::newRow("C: Inf") << u"Inf"_s << u"C"_s << true << qInf(); + QTest::newRow("C: +inf") << u"+inf"_s << u"C"_s << true << qInf(); + QTest::newRow("C: -inf") << u"-inf"_s << u"C"_s << true << -qInf(); + + // Wantonly long-form representations, with trailing and leading zeros: + QTest::newRow("C: 1e-64 long-form") + << (u"0."_s + QString(63, u'0') + u'1' + QString(962, u'0')) << u"C"_s << true << 1e-64; + QTest::newRow("C: 1e+64 long-form") + << (QString(961, u'0') + u'1' + QString(64, u'0') + u".0"_s) << u"C"_s << true << 1e+64; + QTest::newRow("C: long-form 1 via e+64") + << (u"0."_s + QString(63, u'0') + u'1' + QString(962, u'0') + u"e+64"_s) + << u"C"_s << true << 1.0; + QTest::newRow("C: long-form 1 via e-64") + << (QString(961, u'0') + u'1' + QString(64, u'0') + u".0e-64"_s) + << u"C"_s << true << 1.0; + QTest::newRow("C: 12345678.9") << u"12345678.9"_s << u"C"_s << true << 12345678.9; + + // With and without grouping, en vs de for flipped separators: + QTest::newRow("en: 12345678.9") << u"12345678.9"_s << u"en"_s << true << 12345678.9; + QTest::newRow("en: 12,345,678.9") << u"12,345,678.9"_s << u"en"_s << true << 12'345'678.9; + QTest::newRow("de: 12345678,9") << u"12345678,9"_s << u"de"_s << true << 12345678.9; + QTest::newRow("de: 12.345.678,9") << u"12.345.678,9"_s << u"de"_s << true << 12'345'678.9; + + // NaN and infinity are locale-independent (for now - QTBUG-95460) + QTest::newRow("cy: nan") << u"nan"_s << u"cy"_s << true << qQNaN(); + QTest::newRow("cy: NaN") << u"NaN"_s << u"cy"_s << true << qQNaN(); + QTest::newRow("cy: -nan") << u"-nan"_s << u"cy"_s << false << 0.0; + QTest::newRow("cy: +nan") << u"+nan"_s << u"cy"_s << false << 0.0; + QTest::newRow("cy: inf") << u"inf"_s << u"cy"_s << true << qInf(); + QTest::newRow("cy: Inf") << u"Inf"_s << u"cy"_s << true << qInf(); + QTest::newRow("cy: +inf") << u"+inf"_s << u"cy"_s << true << qInf(); + QTest::newRow("cy: -inf") << u"-inf"_s << u"cy"_s << true << -qInf(); + // Samples ready for QTBUG-95460: + QTest::newRow("en: ∞") << u"\u221e"_s << u"en"_s << true << qInf(); + QTest::newRow("ga: Nuimh") << u"Nuimh"_s << u"ga"_s << true << qQNaN(); + + // Locales with multi-character exponents: + QTest::newRow("sv_SE: 4e-3") // Swedish, Sweden + << u"4\u00d7" "10^\u2212" "03"_s << u"sv_SE"_s << true << 4e-3; + QTest::newRow("sv_SE: 4x-3") // Only first character of exponent + << u"4\u00d7\u2212" "03"_s << u"sv_SE"_s << false << 0.0; + QTest::newRow("se_NO: 4e-3") // Northern Sami, Norway + << u"4\u00b7" "10^\u2212" "03"_s << u"se_NO"_s << true << 4e-3; + QTest::newRow("se_NO: 4x-3") // Only first character of exponent + << u"4\u00b7\u2212" "03"_s << u"se_NO"_s << false << 0.0; + QTest::newRow("ar_EG: 4e-3") // Arabic, Egypt + << u"\u0664\u0627\u0633\u061c-\u0660\u0663"_s << u"ar_EG"_s << true << 4e-3; + QTest::newRow("ar_EG: 4x-3") // Only first character of exponent + << u"\u0664\u0627\u061c-\u0660\u0663"_s << u"ar_EG"_s << false << 0.0; + QTest::newRow("ar_EG: 4e!3") // Only first character of sign + << u"\u0664\u0627\u0633\u061c\u0660\u0663"_s << u"ar_EG"_s << false << 0.0; + QTest::newRow("ar_EG: 4x!3") // Only first character of sign and exponent + << u"\u0664\u0627\u061c\u0660\u0663"_s << u"ar_EG"_s << false << 0.0; +} + +void tst_QLocale::toDouble() +{ + QFETCH(QString, text); + QFETCH(QString, locale); + QFETCH(bool, good); + QFETCH(double, expected); + + const QLocale loc(locale); + double actual = expected; + bool ok = false; + QBENCHMARK { + actual = loc.toDouble(text, &ok); + } + QEXPECT_FAIL("en: ∞", "Localized infinity support missing: QTBUG-95460", Abort); + QEXPECT_FAIL("ga: Nuimh", "Localized NaN support missing: QTBUG-95460", Abort); + QCOMPARE(ok, good); + QCOMPARE(actual, expected); +} + QTEST_MAIN(tst_QLocale) -#include "main.moc" +#include "tst_bench_qlocale.moc" diff --git a/tests/benchmarks/corelib/text/qregularexpression/CMakeLists.txt b/tests/benchmarks/corelib/text/qregularexpression/CMakeLists.txt index 1e1f40a2e4..5d029439d0 100644 --- a/tests/benchmarks/corelib/text/qregularexpression/CMakeLists.txt +++ b/tests/benchmarks/corelib/text/qregularexpression/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qregularexpression.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qregularexpression Binary: @@ -7,6 +8,6 @@ qt_internal_add_benchmark(tst_bench_qregularexpression SOURCES tst_bench_qregularexpression.cpp - PUBLIC_LIBRARIES + LIBRARIES Qt::Test ) diff --git a/tests/benchmarks/corelib/text/qregularexpression/tst_bench_qregularexpression.cpp b/tests/benchmarks/corelib/text/qregularexpression/tst_bench_qregularexpression.cpp index 6c9c2ddaf5..83c87be0b1 100644 --- a/tests/benchmarks/corelib/text/qregularexpression/tst_bench_qregularexpression.cpp +++ b/tests/benchmarks/corelib/text/qregularexpression/tst_bench_qregularexpression.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2020 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2020 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QRegularExpression> #include <QTest> diff --git a/tests/benchmarks/corelib/text/qstring/CMakeLists.txt b/tests/benchmarks/corelib/text/qstring/CMakeLists.txt index 4b443cd4aa..f17088d2be 100644 --- a/tests/benchmarks/corelib/text/qstring/CMakeLists.txt +++ b/tests/benchmarks/corelib/text/qstring/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qstring.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qstring Binary: @@ -6,7 +7,7 @@ qt_internal_add_benchmark(tst_bench_qstring SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qstring.cpp + LIBRARIES Qt::Test ) diff --git a/tests/benchmarks/corelib/text/qstring/main.cpp b/tests/benchmarks/corelib/text/qstring/main.cpp deleted file mode 100644 index 0214931b71..0000000000 --- a/tests/benchmarks/corelib/text/qstring/main.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include <QStringList> -#include <QFile> -#include <QTest> - -class tst_QString: public QObject -{ - Q_OBJECT -public: - tst_QString(); -private slots: - void section_regexp_data() { section_data_impl(); } - void section_regularexpression_data() { section_data_impl(); } - void section_regularexpression() { section_impl<QRegularExpression>(); } - void section_string_data() { section_data_impl(false); } - void section_string() { section_impl<QString>(); } - - void toUpper_data(); - void toUpper(); - void toLower_data(); - void toLower(); - void toCaseFolded_data(); - void toCaseFolded(); - -private: - void section_data_impl(bool includeRegExOnly = true); - template <typename RX> void section_impl(); -}; - -tst_QString::tst_QString() -{ -} - -void tst_QString::section_data_impl(bool includeRegExOnly) -{ - QTest::addColumn<QString>("s"); - QTest::addColumn<QString>("sep"); - QTest::addColumn<bool>("isRegExp"); - - QTest::newRow("IPv4") << QStringLiteral("192.168.0.1") << QStringLiteral(".") << false; - QTest::newRow("IPv6") << QStringLiteral("2001:0db8:85a3:0000:0000:8a2e:0370:7334") << QStringLiteral(":") << false; - if (includeRegExOnly) { - QTest::newRow("IPv6-reversed-roles") << QStringLiteral("2001:0db8:85a3:0000:0000:8a2e:0370:7334") << QStringLiteral("\\d+") << true; - QTest::newRow("IPv6-complex") << QStringLiteral("2001:0db8:85a3:0000:0000:8a2e:0370:7334") << QStringLiteral("(\\d+):\\1") << true; - } -} - -template <typename RX> -inline QString escape(const QString &s) -{ return RX::escape(s); } - -template <> -inline QString escape<QString>(const QString &s) -{ return s; } - -template <typename RX> -inline void optimize(RX &) {} - -template <> -inline void optimize(QRegularExpression &rx) -{ rx.optimize(); } - -template <typename RX> -void tst_QString::section_impl() -{ - QFETCH(QString, s); - QFETCH(QString, sep); - QFETCH(bool, isRegExp); - - RX rx(isRegExp ? sep : escape<RX>(sep)); - optimize(rx); - for (int i = 0; i < 20; ++i) - (void) s.count(rx); // make (s, rx) hot - - QBENCHMARK { - const QString result = s.section(rx, 0, 16); - Q_UNUSED(result); - } -} - -void tst_QString::toUpper_data() -{ - QTest::addColumn<QString>("s"); - - QString lowerLatin1(300, QChar('a')); - QString upperLatin1(300, QChar('A')); - - QString lowerDeseret; - { - QString pattern; - pattern += QChar(QChar::highSurrogate(0x10428)); - pattern += QChar(QChar::lowSurrogate(0x10428)); - for (int i = 0; i < 300 / pattern.size(); ++i) - lowerDeseret += pattern; - } - QString upperDeseret; - { - QString pattern; - pattern += QChar(QChar::highSurrogate(0x10400)); - pattern += QChar(QChar::lowSurrogate(0x10400)); - for (int i = 0; i < 300 / pattern.size(); ++i) - upperDeseret += pattern; - } - - QString lowerLigature(600, QChar(0xFB03)); - - QTest::newRow("600<a>") << (lowerLatin1 + lowerLatin1); - QTest::newRow("600<A>") << (upperLatin1 + upperLatin1); - - QTest::newRow("300<a>+300<A>") << (lowerLatin1 + upperLatin1); - QTest::newRow("300<A>+300<a>") << (upperLatin1 + lowerLatin1); - - QTest::newRow("300<10428>") << (lowerDeseret + lowerDeseret); - QTest::newRow("300<10400>") << (upperDeseret + upperDeseret); - - QTest::newRow("150<10428>+150<10400>") << (lowerDeseret + upperDeseret); - QTest::newRow("150<10400>+150<10428>") << (upperDeseret + lowerDeseret); - - QTest::newRow("300a+150<10400>") << (lowerLatin1 + upperDeseret); - QTest::newRow("300a+150<10428>") << (lowerLatin1 + lowerDeseret); - QTest::newRow("300A+150<10400>") << (upperLatin1 + upperDeseret); - QTest::newRow("300A+150<10428>") << (upperLatin1 + lowerDeseret); - - QTest::newRow("600<FB03> (ligature)") << lowerLigature; -} - -void tst_QString::toUpper() -{ - QFETCH(QString, s); - - QBENCHMARK { - s.toUpper(); - } -} - -void tst_QString::toLower_data() -{ - toUpper_data(); -} - -void tst_QString::toLower() -{ - QFETCH(QString, s); - - QBENCHMARK { - s.toLower(); - } -} - -void tst_QString::toCaseFolded_data() -{ - toUpper_data(); -} - -void tst_QString::toCaseFolded() -{ - QFETCH(QString, s); - - QBENCHMARK { - s.toCaseFolded(); - } -} - -QTEST_APPLESS_MAIN(tst_QString) - -#include "main.moc" diff --git a/tests/benchmarks/corelib/text/qstring/tst_bench_qstring.cpp b/tests/benchmarks/corelib/text/qstring/tst_bench_qstring.cpp new file mode 100644 index 0000000000..da5c0ff359 --- /dev/null +++ b/tests/benchmarks/corelib/text/qstring/tst_bench_qstring.cpp @@ -0,0 +1,510 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only +#include <QStringList> +#include <QByteArray> +#include <QLatin1StringView> +#include <QFile> +#include <QTest> +#include <limits> + +using namespace Qt::StringLiterals; + +class tst_QString: public QObject +{ + Q_OBJECT +public: + tst_QString(); +private slots: + void section_regexp_data() { section_data_impl(); } + void section_regularexpression_data() { section_data_impl(); } + void section_regularexpression() { section_impl<QRegularExpression>(); } + void section_string_data() { section_data_impl(false); } + void section_string() { section_impl<QString>(); } + + void toUpper_data(); + void toUpper(); + void toLower_data(); + void toLower(); + void toCaseFolded_data(); + void toCaseFolded(); + + // Serializing: + void number_qlonglong_data(); + void number_qlonglong() { number_impl<qlonglong>(); } + void number_qulonglong_data(); + void number_qulonglong() { number_impl<qulonglong>(); } + + void number_double_data(); + void number_double(); + + // Parsing: + void toLongLong_data(); + void toLongLong(); + void toULongLong_data(); + void toULongLong(); + void toDouble_data(); + void toDouble(); + + // operator=(~) +#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII) + void operator_assign_BA() { operator_assign<QByteArray>(); } + void operator_assign_BA_data() { operator_assign_data(); } + void operator_assign_char() { operator_assign<const char*>(); }; + void operator_assign_char_data() { operator_assign_data();} +#endif + void operator_assign_L1SV() { operator_assign<QLatin1StringView>(); } + void operator_assign_L1SV_data() { operator_assign_data(); } + +private: + void section_data_impl(bool includeRegExOnly = true); + template <typename RX> void section_impl(); + template <typename Integer> void number_impl(); + template <typename T> void operator_assign(); + void operator_assign_data(); +}; + +tst_QString::tst_QString() +{ +} + +void tst_QString::section_data_impl(bool includeRegExOnly) +{ + QTest::addColumn<QString>("s"); + QTest::addColumn<QString>("sep"); + QTest::addColumn<bool>("isRegExp"); + + QTest::newRow("IPv4") << QStringLiteral("192.168.0.1") << QStringLiteral(".") << false; + QTest::newRow("IPv6") << QStringLiteral("2001:0db8:85a3:0000:0000:8a2e:0370:7334") << QStringLiteral(":") << false; + if (includeRegExOnly) { + QTest::newRow("IPv6-reversed-roles") << QStringLiteral("2001:0db8:85a3:0000:0000:8a2e:0370:7334") << QStringLiteral("\\d+") << true; + QTest::newRow("IPv6-complex") << QStringLiteral("2001:0db8:85a3:0000:0000:8a2e:0370:7334") << QStringLiteral("(\\d+):\\1") << true; + } +} + +template <typename RX> +inline QString escape(const QString &s) +{ return RX::escape(s); } + +template <> +inline QString escape<QString>(const QString &s) +{ return s; } + +template <typename RX> +inline void optimize(RX &) {} + +template <> +inline void optimize(QRegularExpression &rx) +{ rx.optimize(); } + +template <typename RX> +void tst_QString::section_impl() +{ + QFETCH(QString, s); + QFETCH(QString, sep); + QFETCH(bool, isRegExp); + + RX rx(isRegExp ? sep : escape<RX>(sep)); + optimize(rx); + for (int i = 0; i < 20; ++i) + (void) s.count(rx); // make (s, rx) hot + + QBENCHMARK { + const QString result = s.section(rx, 0, 16); + Q_UNUSED(result); + } +} + +void tst_QString::toUpper_data() +{ + QTest::addColumn<QString>("s"); + + QString lowerLatin1(300, QChar('a')); + QString upperLatin1(300, QChar('A')); + + QString lowerDeseret; + { + QString pattern; + pattern += QChar(QChar::highSurrogate(0x10428)); + pattern += QChar(QChar::lowSurrogate(0x10428)); + for (int i = 0; i < 300 / pattern.size(); ++i) + lowerDeseret += pattern; + } + QString upperDeseret; + { + QString pattern; + pattern += QChar(QChar::highSurrogate(0x10400)); + pattern += QChar(QChar::lowSurrogate(0x10400)); + for (int i = 0; i < 300 / pattern.size(); ++i) + upperDeseret += pattern; + } + + QString lowerLigature(600, QChar(0xFB03)); + + QTest::newRow("600<a>") << (lowerLatin1 + lowerLatin1); + QTest::newRow("600<A>") << (upperLatin1 + upperLatin1); + + QTest::newRow("300<a>+300<A>") << (lowerLatin1 + upperLatin1); + QTest::newRow("300<A>+300<a>") << (upperLatin1 + lowerLatin1); + + QTest::newRow("300<10428>") << (lowerDeseret + lowerDeseret); + QTest::newRow("300<10400>") << (upperDeseret + upperDeseret); + + QTest::newRow("150<10428>+150<10400>") << (lowerDeseret + upperDeseret); + QTest::newRow("150<10400>+150<10428>") << (upperDeseret + lowerDeseret); + + QTest::newRow("300a+150<10400>") << (lowerLatin1 + upperDeseret); + QTest::newRow("300a+150<10428>") << (lowerLatin1 + lowerDeseret); + QTest::newRow("300A+150<10400>") << (upperLatin1 + upperDeseret); + QTest::newRow("300A+150<10428>") << (upperLatin1 + lowerDeseret); + + QTest::newRow("600<FB03> (ligature)") << lowerLigature; +} + +void tst_QString::toUpper() +{ + QFETCH(QString, s); + + QBENCHMARK { + [[maybe_unused]] auto r = s.toUpper(); + } +} + +void tst_QString::toLower_data() +{ + toUpper_data(); +} + +void tst_QString::toLower() +{ + QFETCH(QString, s); + + QBENCHMARK { + [[maybe_unused]] auto r = s.toLower(); + } +} + +void tst_QString::toCaseFolded_data() +{ + toUpper_data(); +} + +void tst_QString::toCaseFolded() +{ + QFETCH(QString, s); + + QBENCHMARK { + [[maybe_unused]] auto r = s.toCaseFolded(); + } +} + +template <typename Integer> +void tst_QString::number_impl() +{ + QFETCH(Integer, number); + QFETCH(int, base); + QFETCH(QString, expected); + + QString actual; + QBENCHMARK { + actual = QString::number(number, base); + } + QCOMPARE(actual, expected); +} + +template <typename Integer> +void number_integer_common() +{ + QTest::addColumn<Integer>("number"); + QTest::addColumn<int>("base"); + QTest::addColumn<QString>("expected"); + + QTest::newRow("0") << Integer(0ull) << 10 << QStringLiteral("0"); + QTest::newRow("1234") << Integer(1234ull) << 10 << QStringLiteral("1234"); + QTest::newRow("123456789") << Integer(123456789ull) << 10 << QStringLiteral("123456789"); + QTest::newRow("bad1dea, base 16") << Integer(0xBAD1DEAull) << 16 << QStringLiteral("bad1dea"); + QTest::newRow("242, base 8") << Integer(0242ull) << 8 << QStringLiteral("242"); + QTest::newRow("101101, base 2") << Integer(0b101101ull) << 2 << QStringLiteral("101101"); + QTest::newRow("ad, base 30") << Integer(313ull) << 30 << QStringLiteral("ad"); +} + +void tst_QString::number_qlonglong_data() +{ + number_integer_common<qlonglong>(); + + QTest::newRow("-1234") << -1234ll << 10 << QStringLiteral("-1234"); + QTest::newRow("-123456789") << -123456789ll << 10 << QStringLiteral("-123456789"); + QTest::newRow("-bad1dea, base 16") << -0xBAD1DEAll << 16 << QStringLiteral("-bad1dea"); + QTest::newRow("-242, base 8") << -0242ll << 8 << QStringLiteral("-242"); + QTest::newRow("-101101, base 2") << -0b101101ll << 2 << QStringLiteral("-101101"); + QTest::newRow("-ad, base 30") << -313ll << 30 << QStringLiteral("-ad"); + + QTest::newRow("qlonglong-max") + << std::numeric_limits<qlonglong>::max() << 10 << QStringLiteral("9223372036854775807"); + QTest::newRow("qlonglong-min") + << std::numeric_limits<qlonglong>::min() << 10 + << QStringLiteral("-9223372036854775808"); + QTest::newRow("qlonglong-max, base 2") + << std::numeric_limits<qlonglong>::max() << 2 << QString(63, u'1'); + QTest::newRow("qlonglong-min, base 2") << std::numeric_limits<qlonglong>::min() << 2 + << (QStringLiteral("-1") + QString(63, u'0')); + QTest::newRow("qlonglong-max, base 16") + << std::numeric_limits<qlonglong>::max() << 16 << (QChar(u'7') + QString(15, u'f')); + QTest::newRow("qlonglong-min, base 16") << std::numeric_limits<qlonglong>::min() << 16 + << (QStringLiteral("-8") + QString(15, u'0')); +} + +void tst_QString::number_qulonglong_data() +{ + number_integer_common<qulonglong>(); + + QTest::newRow("qlonglong-max + 1") + << (qulonglong(std::numeric_limits<qlonglong>::max()) + 1) << 10 + << QStringLiteral("9223372036854775808"); + QTest::newRow("qulonglong-max") + << std::numeric_limits<qulonglong>::max() << 10 + << QStringLiteral("18446744073709551615"); + QTest::newRow("qulonglong-max, base 2") + << std::numeric_limits<qulonglong>::max() << 2 << QString(64, u'1'); + QTest::newRow("qulonglong-max, base 16") + << std::numeric_limits<qulonglong>::max() << 16 << QString(16, u'f'); +} + +void tst_QString::number_double_data() +{ + QTest::addColumn<double>("number"); + QTest::addColumn<char>("format"); + QTest::addColumn<int>("precision"); + QTest::addColumn<QString>("expected"); + + struct + { + double d; + char f; + int p; + QString expected; + } data[] = { + { 0.0, 'f', 0, QStringLiteral("0") }, + { 0.0001, 'f', 0, QStringLiteral("0") }, + { 0.1234, 'f', 5, QStringLiteral("0.12340") }, + { -0.1234, 'f', 5, QStringLiteral("-0.12340") }, + { 0.5 + qSqrt(1.25), 'f', 15, QStringLiteral("1.618033988749895") }, + { std::numeric_limits<double>::epsilon(), 'g', 10, QStringLiteral("2.220446049e-16") }, + { 0.0001, 'E', 1, QStringLiteral("1.0E-04") }, + { 1e8, 'E', 1, QStringLiteral("1.0E+08") }, + { -1e8, 'E', 1, QStringLiteral("-1.0E+08") }, + }; + + for (auto &datum : data) { + QTest::addRow("%s, format '%c', precision %d", qPrintable(datum.expected), datum.f, + datum.p) + << datum.d << datum.f << datum.p << datum.expected; + } +} + +void tst_QString::number_double() +{ + QFETCH(double, number); + QFETCH(char, format); + QFETCH(int, precision); + QFETCH(QString, expected); + + QString actual; + QBENCHMARK { + actual = QString::number(number, format, precision); + } + QCOMPARE(actual, expected); +} + +template <typename Integer> +void toWholeCommon_data() +{ + QTest::addColumn<QString>("text"); + QTest::addColumn<int>("base"); + QTest::addColumn<bool>("good"); + QTest::addColumn<Integer>("expected"); + + QTest::newRow("empty") << u""_s << 10 << false << Integer(0ull); + QTest::newRow("0") << u"0"_s << 10 << true << Integer(0ull); + QTest::newRow("1234") << u"1234"_s << 10 << true << Integer(1234ull); + QTest::newRow("1,234") << u"1,234"_s << 10 << false << Integer(0ull); + QTest::newRow("123456789") + << u"123456789"_s << 10 << true << Integer(123456789ull); + QTest::newRow("bad1dea, base 16") + << u"bad1dea"_s << 16 << true << Integer(0xBAD1DEAull); + QTest::newRow("bad1dea, base 10") << u"bad1dea"_s << 10 << false << Integer(0ull); + QTest::newRow("42, base 13") << u"42"_s << 13 << true << Integer(6ull * 9ull); + QTest::newRow("242, base 8") << u"242"_s << 8 << true << Integer(0242ull); + QTest::newRow("495, base 8") << u"495"_s << 8 << false << Integer(0ull); + QTest::newRow("101101, base 2") + << u"101101"_s << 2 << true << Integer(0b101101ull); + QTest::newRow("ad, base 30") << u"ad"_s << 30 << true << Integer(313ull); +} + +void tst_QString::toLongLong_data() +{ + toWholeCommon_data<qlonglong>(); + + QTest::newRow("-1234") << u"-1234"_s << 10 << true << -1234ll; + QTest::newRow("-123456789") << u"-123456789"_s << 10 << true << -123456789ll; + QTest::newRow("-bad1dea, base 16") << u"-bad1dea"_s << 16 << true << -0xBAD1DEAll; + QTest::newRow("-242, base 8") << u"-242"_s << 8 << true << -0242ll; + QTest::newRow("-101101, base 2") << u"-101101"_s << 2 << true << -0b101101ll; + QTest::newRow("-ad, base 30") << u"-ad"_s << 30 << true << -313ll; + + QTest::newRow("qlonglong-max") + << u"9223372036854775807"_s << 10 << true + << std::numeric_limits<qlonglong>::max(); + QTest::newRow("qlonglong-min") + << u"-9223372036854775808"_s << 10 << true + << std::numeric_limits<qlonglong>::min(); + QTest::newRow("qlonglong-max, base 2") + << QString(63, u'1') << 2 << true << std::numeric_limits<qlonglong>::max(); + QTest::newRow("qlonglong-min, base 2") + << (u"-1"_s + QString(63, u'0')) << 2 << true + << std::numeric_limits<qlonglong>::min(); + QTest::newRow("qlonglong-max, base 16") + << (QChar(u'7') + QString(15, u'f')) << 16 << true + << std::numeric_limits<qlonglong>::max(); + QTest::newRow("qlonglong-min, base 16") + << (u"-8"_s + QString(15, u'0')) << 16 << true + << std::numeric_limits<qlonglong>::min(); +} + +void tst_QString::toLongLong() +{ + QFETCH(QString, text); + QFETCH(int, base); + QFETCH(bool, good); + QFETCH(qlonglong, expected); + + qlonglong actual = expected; + bool ok = false; + QBENCHMARK { + actual = text.toLongLong(&ok, base); + } + QCOMPARE(ok, good); + QCOMPARE(actual, expected); +} + +void tst_QString::toULongLong_data() +{ + toWholeCommon_data<qulonglong>(); + + QTest::newRow("qlonglong-max + 1") + << u"9223372036854775808"_s << 10 << true + << (qulonglong(std::numeric_limits<qlonglong>::max()) + 1); + QTest::newRow("qulonglong-max") + << u"18446744073709551615"_s << 10 << true + << std::numeric_limits<qulonglong>::max(); + QTest::newRow("qulonglong-max, base 2") + << QString(64, u'1') << 2 << true << std::numeric_limits<qulonglong>::max(); + QTest::newRow("qulonglong-max, base 16") + << QString(16, u'f') << 16 << true << std::numeric_limits<qulonglong>::max(); +} + +void tst_QString::toULongLong() +{ + QFETCH(QString, text); + QFETCH(int, base); + QFETCH(bool, good); + QFETCH(qulonglong, expected); + + qulonglong actual = expected; + bool ok = false; + QBENCHMARK { + actual = text.toULongLong(&ok, base); + } + QCOMPARE(ok, good); + QCOMPARE(actual, expected); +} + +void tst_QString::toDouble_data() +{ + QTest::addColumn<QString>("text"); + QTest::addColumn<bool>("good"); + QTest::addColumn<double>("expected"); + + QTest::newRow("empty") << u""_s << false << 0.0; + QTest::newRow("0") << u"0"_s << true << 0.0; + QTest::newRow("0.12340") << u"0.12340"_s << true << 0.12340; + QTest::newRow("-0.12340") << u"-0.12340"_s << true << -0.12340; + QTest::newRow("epsilon") + << u"2.220446049e-16"_s << true << std::numeric_limits<double>::epsilon(); + QTest::newRow("1.0e-4") << u"1.0e-4"_s << true << 1.0e-4; + QTest::newRow("1.0e+4") << u"1.0e+4"_s << true << 1.0e+4; + QTest::newRow("10.e+3") << u"10.e+3"_s << true << 1.0e+4; + QTest::newRow("10e+3.") << u"10e+3."_s << false << 0.0; + QTest::newRow("1e4") << u"1e4"_s << true << 1.0e+4; + QTest::newRow("1.0e-8") << u"1.0e-8"_s << true << 1.0e-8; + QTest::newRow("1.0e+8") << u"1.0e+8"_s << true << 1.0e+8; + + // NaN and infinity: + QTest::newRow("nan") << u"nan"_s << true << qQNaN(); + QTest::newRow("NaN") << u"NaN"_s << true << qQNaN(); + QTest::newRow("-nan") << u"-nan"_s << false << 0.0; + QTest::newRow("+nan") << u"+nan"_s << false << 0.0; + QTest::newRow("inf") << u"inf"_s << true << qInf(); + QTest::newRow("Inf") << u"Inf"_s << true << qInf(); + QTest::newRow("+inf") << u"+inf"_s << true << qInf(); + QTest::newRow("-inf") << u"-inf"_s << true << -qInf(); +} + +void tst_QString::toDouble() +{ + QFETCH(QString, text); + QFETCH(bool, good); + QFETCH(double, expected); + + double actual = expected; + bool ok = false; + QBENCHMARK { + actual = text.toDouble(&ok); + } + QCOMPARE(ok, good); + QCOMPARE(actual, expected); +} + +template <typename T> void tst_QString::operator_assign() +{ + QFETCH(QByteArray, data); + QString str(data.size(), Qt::Uninitialized); + + T tdata; + if constexpr (std::is_same_v<T, const char*>) { + tdata = data.constData(); + } else if constexpr (std::is_same_v<T, QLatin1String>) { + tdata = T(data.constData(), data.size()); + } else { + tdata = T(data.constData(), data.size()); + tdata.detach(); + } + + QBENCHMARK { + str.operator=(tdata); + } +} + +void tst_QString::operator_assign_data() +{ + QTest::addColumn<QByteArray>("data"); + + QByteArray data; + data.fill('a', 5); + QTest::newRow("length: 5") << data; + data.fill('b', 10); + QTest::newRow("length: 10") << data; + data.fill('c', 20); + QTest::newRow("length: 20") << data; + data.fill('d', 50); + QTest::newRow("length: 50") << data; + data.fill('e', 100); + QTest::newRow("length: 100") << data; + data.fill('f', 500); + QTest::newRow("length: 500") << data; + data.fill('g', 1'000); + QTest::newRow("length: 1'000") << data; +} + +QTEST_APPLESS_MAIN(tst_QString) + +#include "tst_bench_qstring.moc" diff --git a/tests/benchmarks/corelib/text/qstringbuilder/CMakeLists.txt b/tests/benchmarks/corelib/text/qstringbuilder/CMakeLists.txt index 33b1b5fe5e..c3c95e233c 100644 --- a/tests/benchmarks/corelib/text/qstringbuilder/CMakeLists.txt +++ b/tests/benchmarks/corelib/text/qstringbuilder/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qstringbuilder.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qstringbuilder Binary: @@ -6,13 +7,9 @@ qt_internal_add_benchmark(tst_bench_qstringbuilder SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qstringbuilder.cpp + LIBRARIES Qt::Test COMPILE_OPTIONS -g ) - -#### Keys ignored in scope 1:.:.:qstringbuilder.pro:<TRUE>: -# QMAKE_CFLAGS = "-g" -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/text/qstringbuilder/main.cpp b/tests/benchmarks/corelib/text/qstringbuilder/tst_bench_qstringbuilder.cpp index 757e2cc683..496abdaf3b 100644 --- a/tests/benchmarks/corelib/text/qstringbuilder/main.cpp +++ b/tests/benchmarks/corelib/text/qstringbuilder/tst_bench_qstringbuilder.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only // Select one of the scenarios below #define SCENARIO 1 @@ -96,12 +71,12 @@ #define LITERAL "some string literal" -class tst_qstringbuilder : public QObject +class tst_QStringBuilder : public QObject { Q_OBJECT public: - tst_qstringbuilder() + tst_QStringBuilder() : l1literal(LITERAL), l1string(LITERAL), ba(LITERAL), @@ -408,8 +383,8 @@ private: std::string stdr; }; -QTEST_MAIN(tst_qstringbuilder) - #undef P -#include "main.moc" +QTEST_MAIN(tst_QStringBuilder) + +#include "tst_bench_qstringbuilder.moc" diff --git a/tests/benchmarks/corelib/text/qstringlist/CMakeLists.txt b/tests/benchmarks/corelib/text/qstringlist/CMakeLists.txt index 4649e3408a..da2f84d6e9 100644 --- a/tests/benchmarks/corelib/text/qstringlist/CMakeLists.txt +++ b/tests/benchmarks/corelib/text/qstringlist/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qstringlist.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qstringlist Binary: @@ -6,7 +7,7 @@ qt_internal_add_benchmark(tst_bench_qstringlist SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qstringlist.cpp + LIBRARIES Qt::Test ) diff --git a/tests/benchmarks/corelib/text/qstringlist/main.cpp b/tests/benchmarks/corelib/text/qstringlist/tst_bench_qstringlist.cpp index eb507c7c64..2431446bf6 100644 --- a/tests/benchmarks/corelib/text/qstringlist/main.cpp +++ b/tests/benchmarks/corelib/text/qstringlist/tst_bench_qstringlist.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QStringList> #include <QTest> @@ -33,6 +8,8 @@ #include <string> #include <vector> +using namespace Qt::StringLiterals; + class tst_QStringList: public QObject { Q_OBJECT @@ -44,6 +21,11 @@ private slots: void removeDuplicates() const; void removeDuplicates_data() const; + void filter_data() const; + void filter() const; + void filter_stringMatcher_data() const { filter_data(); } + void filter_stringMatcher() const; + void split_qlist_qbytearray() const; void split_qlist_qbytearray_data() const { return split_data(); } @@ -68,9 +50,9 @@ private: QStringList tst_QStringList::populateList(const int count, const QString &unit) { QStringList retval; - + retval.reserve(count); for (int i = 0; i < count; ++i) - retval.append(unit); + retval.append(unit + QString::number(i)); return retval; } @@ -93,7 +75,7 @@ void tst_QStringList::join() const QFETCH(QString, separator); QBENCHMARK { - input.join(separator); + [[maybe_unused]] auto r = input.join(separator); } } @@ -102,20 +84,20 @@ void tst_QStringList::join_data() const QTest::addColumn<QStringList>("input"); QTest::addColumn<QString>("separator"); - QTest::newRow("") + QTest::newRow("100") << populateList(100, QLatin1String("unit")) << QString(); - QTest::newRow("") + QTest::newRow("1000") << populateList(1000, QLatin1String("unit")) << QString(); - QTest::newRow("") - << populateList(10000, QLatin1String("unit")) + QTest::newRow("10000") + << populateList(10'000, QLatin1String("unit")) << QString(); - QTest::newRow("") - << populateList(100000, QLatin1String("unit")) + QTest::newRow("100000") + << populateList(100'000, QLatin1String("unit")) << QString(); } @@ -155,6 +137,39 @@ void tst_QStringList::removeDuplicates_data() const QTest::addRow("long-dup-0.75") << (l + l + l + l); } +void tst_QStringList::filter_data() const +{ + QTest::addColumn<QStringList>("list"); + QTest::addColumn<QStringList>("expected"); + + for (int i : {10, 20, 30, 40, 50, 70, 80, 100, 300, 500, 700, 900, 10'000}) { + QStringList list = populateList(i, u"A rather long string to test QStringMatcher"_s); + list.append(u"Horse and cart from old"_s); + QTest::addRow("list%d", i) << list << QStringList(u"Horse and cart from old"_s); + } +} + +void tst_QStringList::filter() const +{ + QFETCH(QStringList, list); + QFETCH(QStringList, expected); + + QBENCHMARK { + QCOMPARE(list.filter(u"Horse and cart from old", Qt::CaseSensitive), expected); + } +} + +void tst_QStringList::filter_stringMatcher() const +{ + QFETCH(QStringList, list); + QFETCH(QStringList, expected); + + const QStringMatcher matcher(u"Horse and cart from old", Qt::CaseSensitive); + QBENCHMARK { + QCOMPARE(list.filter(matcher), expected); + } +} + void tst_QStringList::split_data() const { QTest::addColumn<QString>("input"); @@ -173,7 +188,7 @@ void tst_QStringList::split_qlist_qbytearray() const QByteArray ba = input.toLatin1(); QBENCHMARK { - ba.split(splitChar); + [[maybe_unused]] auto r = ba.split(splitChar); } } @@ -183,7 +198,7 @@ void tst_QStringList::split_qlist_qstring() const const QChar splitChar = ':'; QBENCHMARK { - input.split(splitChar); + [[maybe_unused]] auto r = input.split(splitChar); } } @@ -237,4 +252,4 @@ void tst_QStringList::split_stdlist_stdstring() const QTEST_MAIN(tst_QStringList) -#include "main.moc" +#include "tst_bench_qstringlist.moc" diff --git a/tests/benchmarks/corelib/text/qstringtokenizer/CMakeLists.txt b/tests/benchmarks/corelib/text/qstringtokenizer/CMakeLists.txt index c2bf848400..11720e5204 100644 --- a/tests/benchmarks/corelib/text/qstringtokenizer/CMakeLists.txt +++ b/tests/benchmarks/corelib/text/qstringtokenizer/CMakeLists.txt @@ -1,11 +1,14 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + ##################################################################### ## tst_bench_qstringtokenizer Binary: ##################################################################### qt_internal_add_benchmark(tst_bench_qstringtokenizer SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qstringtokenizer.cpp + LIBRARIES Qt::Test ) diff --git a/tests/benchmarks/corelib/text/qstringtokenizer/main.cpp b/tests/benchmarks/corelib/text/qstringtokenizer/tst_bench_qstringtokenizer.cpp index 54f48d5ea5..eccfad91da 100644 --- a/tests/benchmarks/corelib/text/qstringtokenizer/main.cpp +++ b/tests/benchmarks/corelib/text/qstringtokenizer/tst_bench_qstringtokenizer.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QtTest/QTest> @@ -142,4 +117,4 @@ void tst_QStringTokenizer::tokenize() const QTEST_MAIN(tst_QStringTokenizer) -#include "main.moc" +#include "tst_bench_qstringtokenizer.moc" diff --git a/tests/benchmarks/corelib/text/qutf8stringview/CMakeLists.txt b/tests/benchmarks/corelib/text/qutf8stringview/CMakeLists.txt new file mode 100644 index 0000000000..14613afe56 --- /dev/null +++ b/tests/benchmarks/corelib/text/qutf8stringview/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +##################################################################### +## tst_bench_qutf8stringview Binary: +##################################################################### + +qt_internal_add_benchmark(tst_bench_qutf8stringview + SOURCES + tst_bench_qutf8stringview.cpp + LIBRARIES + Qt::Test + Qt::CorePrivate +) diff --git a/tests/benchmarks/corelib/text/qutf8stringview/tst_bench_qutf8stringview.cpp b/tests/benchmarks/corelib/text/qutf8stringview/tst_bench_qutf8stringview.cpp new file mode 100644 index 0000000000..ec633ff67d --- /dev/null +++ b/tests/benchmarks/corelib/text/qutf8stringview/tst_bench_qutf8stringview.cpp @@ -0,0 +1,263 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <qbytearray.h> +#include <qdebug.h> +#include <qstring.h> +#include <qtest.h> +#include <qutf8stringview.h> + +class tst_QUtf8StringView : public QObject +{ + Q_OBJECT + +private slots: + void equalStringsLatin1_data() { equalStrings_data(); } + void equalStringsLatin1(); + void equalStringsUtf16_data() { equalStrings_data(); } + void equalStringsUtf16(); + void equalStringsUtf8_data() { equalStrings_data(); } + void equalStringsUtf8(); + + void compareStringsCaseSensitiveLatin1_data() { compareStringsCaseSensitive_data(); } + void compareStringsCaseSensitiveLatin1() { compareStringsLatin1(true); } + void compareStringsCaseSensitiveUtf16_data() { compareStringsCaseSensitive_data(); } + void compareStringsCaseSensitiveUtf16() { compareStringsUtf16(true); } + void compareStringsCaseSensitiveUtf8_data() { compareStringsCaseSensitive_data(); } + void compareStringsCaseSensitiveUtf8() { compareStringsUtf8(true); } + + void compareStringsCaseInsensitiveLatin1_data() { compareStringsCaseInsensitive_data(); } + void compareStringsCaseInsensitiveLatin1() { compareStringsLatin1(false); } + void compareStringsCaseInsensitiveUtf16_data() { compareStringsCaseInsensitive_data(); } + void compareStringsCaseInsensitiveUtf16() { compareStringsUtf16(false); } + void compareStringsCaseInsensitiveUtf8_data() { compareStringsCaseInsensitive_data(); } + void compareStringsCaseInsensitiveUtf8() { compareStringsUtf8(false); } + + void compareStringsWithErrors_data(); + void compareStringsWithErrors(); + +private: + void equalStrings_data(); + void compareStringsCaseSensitive_data(); + void compareStringsCaseInsensitive_data(); + void compareStringsLatin1(bool caseSensitive); + void compareStringsUtf16(bool caseSensitive); + void compareStringsUtf8(bool caseSensitive); +}; + +void tst_QUtf8StringView::equalStrings_data() +{ + QTest::addColumn<QString>("lhs"); + QTest::addColumn<QString>("rhs"); + QTest::addColumn<bool>("isEqual"); + + QTest::newRow("EqualStrings") << "Test" + << "Test" << true; + QTest::newRow("EqualStringsLong") + << "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + << "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" << true; + QTest::newRow("DifferentCase") << "test" + << "Test" << false; + QTest::newRow("DifferentCaseLong") + << "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + << "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" << false; + QTest::newRow("ReverseStrings") << "Test" + << "tseT" << false; + QTest::newRow("Latin1RangeCharacter") << u8"B\u00d8" << u8"B\u00d8" << true; + QTest::newRow("Latin1RangeCharacterDifferentCase") << u8"B\u00d8" << u8"B\u00f8" << false; +} + +void tst_QUtf8StringView::equalStringsLatin1() +{ + QFETCH(QString, lhs); + QFETCH(QString, rhs); + QFETCH(bool, isEqual); + QByteArray left = lhs.toUtf8(); + QByteArray right = rhs.toLatin1(); + QBasicUtf8StringView<false> lhv(left); + QLatin1StringView rhv(right); + bool result; + + QBENCHMARK { + result = QtPrivate::equalStrings(lhv, rhv); + }; + QCOMPARE(result, isEqual); +} + +void tst_QUtf8StringView::equalStringsUtf16() +{ + QFETCH(QString, lhs); + QFETCH(QString, rhs); + QFETCH(bool, isEqual); + + QByteArray left = lhs.toUtf8(); + QBasicUtf8StringView<false> lhv(left); + QStringView rhv(rhs); + bool result; + + QBENCHMARK { + result = QtPrivate::equalStrings(lhv, rhv); + }; + QCOMPARE(result, isEqual); +} + +void tst_QUtf8StringView::equalStringsUtf8() +{ + QFETCH(QString, lhs); + QFETCH(QString, rhs); + QFETCH(bool, isEqual); + + QByteArray left = lhs.toUtf8(); + QByteArray right = rhs.toUtf8(); + QBasicUtf8StringView<false> lhv(left); + QBasicUtf8StringView<false> rhv(right); + bool result; + + QBENCHMARK { + result = QtPrivate::equalStrings(lhv, rhv); + }; + QCOMPARE(result, isEqual); +} + +void tst_QUtf8StringView::compareStringsCaseSensitive_data() +{ + QTest::addColumn<QString>("lhs"); + QTest::addColumn<QString>("rhs"); + QTest::addColumn<int>("compareValue"); + + QTest::newRow("EqualStrings") << "Test" + << "Test" << 0; + QTest::newRow("EqualStringsLong") << "abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ" + << "abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ" << 0; + QTest::newRow("DifferentCase") << "test" + << "Test" << 32; + QTest::newRow("DifferentCaseLong") + << "abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ" + << "abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz" << -32; + QTest::newRow("ReverseStrings") << "Test" + << "tseT" << -32; + QTest::newRow("Different Strings") << "Testing and testing" + << "Testing and resting" << 2; + QTest::newRow("Latin1RangeCharacter") << u8"B\u00d8" << u8"B\u00d8" << 0; + QTest::newRow("Latin1RangeCharacterDifferentCase") << u8"B\u00d8" << u8"B\u00f8" << -32; +} + +void tst_QUtf8StringView::compareStringsCaseInsensitive_data() +{ + QTest::addColumn<QString>("lhs"); + QTest::addColumn<QString>("rhs"); + QTest::addColumn<int>("compareValue"); + + QTest::newRow("EqualStrings") << "Test" + << "Test" << 0; + QTest::newRow("EqualStringsLong") << "abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ" + << "abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ" << 0; + QTest::newRow("DifferentCase") << "test" + << "Test" << 0; + QTest::newRow("DifferentCaseLong") << "abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ" + << "abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz" << 0; + QTest::newRow("ReverseStrings") << "Test" + << "tseT" << -14; + QTest::newRow("Different Strings") << "Testing and testing" + << "Testing and resting" << 2; + QTest::newRow("Latin1RangeCharacter") << u8"B\u00d8" << u8"B\u00d8" << 0; + QTest::newRow("Latin1RangeCharacterDifferentCase") << u8"B\u00d8" << u8"B\u00f8" << 0; +} + +void tst_QUtf8StringView::compareStringsLatin1(bool caseSensitive) +{ + QFETCH(QString, lhs); + QFETCH(QString, rhs); + QFETCH(int, compareValue); + QByteArray left = lhs.toUtf8(); + QByteArray right = rhs.toLatin1(); + QBasicUtf8StringView<false> lhv(left); + QLatin1StringView rhv(right); + Qt::CaseSensitivity cs = caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive; + int result; + + QBENCHMARK { + result = lhv.compare(rhv, cs); + }; + QCOMPARE(result, compareValue); +} + +void tst_QUtf8StringView::compareStringsUtf16(bool caseSensitive) +{ + QFETCH(QString, lhs); + QFETCH(QString, rhs); + QFETCH(int, compareValue); + + QByteArray left = lhs.toUtf8(); + QBasicUtf8StringView<false> lhv(left); + QStringView rhv(rhs); + Qt::CaseSensitivity cs = caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive; + int result; + + QBENCHMARK { + result = lhv.compare(rhv, cs); + }; + QCOMPARE(result, compareValue); +} + +void tst_QUtf8StringView::compareStringsUtf8(bool caseSensitive) +{ + QFETCH(QString, lhs); + QFETCH(QString, rhs); + QFETCH(int, compareValue); + + QByteArray left = lhs.toUtf8(); + QByteArray right = rhs.toUtf8(); + QBasicUtf8StringView<false> lhv(left); + QBasicUtf8StringView<false> rhv(right); + Qt::CaseSensitivity cs = caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive; + int result; + + QBENCHMARK { + result = lhv.compare(rhv, cs); + }; + QCOMPARE(result, compareValue); +} + +void tst_QUtf8StringView::compareStringsWithErrors_data() +{ + QTest::addColumn<QByteArray>("lhs"); + QTest::addColumn<QByteArray>("rhs"); + QTest::addColumn<int>("compare"); + QTest::addColumn<bool>("caseSensitive"); + + QTest::newRow("Compare errors 0xfe vs 0xff case-insensitive") + << QByteArray("\xfe") << QByteArray("\xff") << 0 << false; + QTest::newRow("Compare errors 0xff vs 0xff case-insensitive") + << QByteArray("\xff") << QByteArray("\xff") << 0 << false; + QTest::newRow("Compare 'a' with error 0xff case-insensitive") + << QByteArray("a") << QByteArray("\xff") << -65436 << false; + QTest::newRow("Compare errors 0xfe vs 0xff case-sensitive") + << QByteArray("\xfe") << QByteArray("\xff") << -1 << true; + QTest::newRow("Compare errors 0xff vs 0xff case-sensitive") + << QByteArray("\xff") << QByteArray("\xff") << 0 << true; + QTest::newRow("Compare 'a' with error 0xff case-sensitive") + << QByteArray("a") << QByteArray("\xff") << -158 << true; +} + +void tst_QUtf8StringView::compareStringsWithErrors() +{ + QFETCH(QByteArray, lhs); + QFETCH(QByteArray, rhs); + QFETCH(int, compare); + QFETCH(bool, caseSensitive); + QBasicUtf8StringView<false> lhv(lhs); + QBasicUtf8StringView<false> rhv(rhs); + Qt::CaseSensitivity cs = caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive; + int result; + + QBENCHMARK { + result = lhv.compare(rhv, cs); + }; + QCOMPARE(result, compare); + QCOMPARE(-result, rhv.compare(lhv, cs)); +} + +QTEST_MAIN(tst_QUtf8StringView) + +#include "tst_bench_qutf8stringview.moc" diff --git a/tests/benchmarks/corelib/thread/CMakeLists.txt b/tests/benchmarks/corelib/thread/CMakeLists.txt index 8f7b829a40..fd7cbe6117 100644 --- a/tests/benchmarks/corelib/thread/CMakeLists.txt +++ b/tests/benchmarks/corelib/thread/CMakeLists.txt @@ -1,6 +1,9 @@ -# Generated from thread.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause -add_subdirectory(qfuture) +if(QT_FEATURE_future) + add_subdirectory(qfuture) +endif() add_subdirectory(qmutex) add_subdirectory(qreadwritelock) add_subdirectory(qthreadstorage) diff --git a/tests/benchmarks/corelib/thread/qfuture/CMakeLists.txt b/tests/benchmarks/corelib/thread/qfuture/CMakeLists.txt index 4a737c62b8..5988b1c0b0 100644 --- a/tests/benchmarks/corelib/thread/qfuture/CMakeLists.txt +++ b/tests/benchmarks/corelib/thread/qfuture/CMakeLists.txt @@ -1,3 +1,6 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + ##################################################################### ## tst_bench_qfuture Binary: ##################################################################### @@ -5,7 +8,7 @@ qt_internal_add_benchmark(tst_bench_qfuture EXCEPTIONS SOURCES - tst_qfuture.cpp - PUBLIC_LIBRARIES + tst_bench_qfuture.cpp + LIBRARIES Qt::Test ) diff --git a/tests/benchmarks/corelib/thread/qfuture/tst_qfuture.cpp b/tests/benchmarks/corelib/thread/qfuture/tst_bench_qfuture.cpp index c7a4ff24d9..38b3f636c9 100644 --- a/tests/benchmarks/corelib/thread/qfuture/tst_qfuture.cpp +++ b/tests/benchmarks/corelib/thread/qfuture/tst_bench_qfuture.cpp @@ -1,35 +1,11 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QTest> #include <qexception.h> #include <qfuture.h> +#include <qpromise.h> #include <qsemaphore.h> class tst_QFuture : public QObject @@ -37,7 +13,7 @@ class tst_QFuture : public QObject Q_OBJECT private slots: - void makeReadyfuture(); + void makeReadyValueFuture(); #ifndef QT_NO_EXCEPTIONS void makeExceptionalFuture(); #endif @@ -67,10 +43,10 @@ private slots: void progressText(); }; -void tst_QFuture::makeReadyfuture() +void tst_QFuture::makeReadyValueFuture() { QBENCHMARK { - auto future = QtFuture::makeReadyFuture(42); + auto future = QtFuture::makeReadyValueFuture(42); Q_UNUSED(future); } } @@ -88,7 +64,7 @@ void tst_QFuture::makeExceptionalFuture() void tst_QFuture::result() { - auto future = QtFuture::makeReadyFuture(42); + auto future = QtFuture::makeReadyValueFuture(42); QBENCHMARK { auto value = future.result(); @@ -116,7 +92,7 @@ void tst_QFuture::results() void tst_QFuture::takeResult() { QBENCHMARK { - auto future = QtFuture::makeReadyFuture(42); + auto future = QtFuture::makeReadyValueFuture(42); auto value = future.takeResult(); Q_UNUSED(value); } @@ -164,7 +140,7 @@ void tst_QFuture::reportException() void tst_QFuture::then() { - auto f = QtFuture::makeReadyFuture(42); + auto f = QtFuture::makeReadyValueFuture(42); QBENCHMARK { auto future = f.then([](int value) { return value; }); Q_UNUSED(future); @@ -173,7 +149,7 @@ void tst_QFuture::then() void tst_QFuture::thenVoid() { - auto f = QtFuture::makeReadyFuture(); + auto f = QtFuture::makeReadyVoidFuture(); QBENCHMARK { auto future = f.then([] {}); Q_UNUSED(future); @@ -229,7 +205,7 @@ void tst_QFuture::onFailedVoid() void tst_QFuture::thenOnFailed() { - auto f = QtFuture::makeReadyFuture(42); + auto f = QtFuture::makeReadyValueFuture(42); QBENCHMARK { auto future = f.then([](int) { throw std::runtime_error("error"); }).onFailed([] { return 0; }); @@ -239,7 +215,7 @@ void tst_QFuture::thenOnFailed() void tst_QFuture::thenOnFailedVoid() { - auto f = QtFuture::makeReadyFuture(); + auto f = QtFuture::makeReadyVoidFuture(); QBENCHMARK { auto future = f.then([] { throw std::runtime_error("error"); }).onFailed([] {}); Q_UNUSED(future); @@ -317,4 +293,5 @@ void tst_QFuture::progressText() } QTEST_MAIN(tst_QFuture) -#include "tst_qfuture.moc" + +#include "tst_bench_qfuture.moc" diff --git a/tests/benchmarks/corelib/thread/qmutex/CMakeLists.txt b/tests/benchmarks/corelib/thread/qmutex/CMakeLists.txt index 8872a50227..2d01f9ff1f 100644 --- a/tests/benchmarks/corelib/thread/qmutex/CMakeLists.txt +++ b/tests/benchmarks/corelib/thread/qmutex/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qmutex.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qmutex Binary: @@ -6,10 +7,8 @@ qt_internal_add_benchmark(tst_bench_qmutex SOURCES - tst_qmutex.cpp - PUBLIC_LIBRARIES + tst_bench_qmutex.cpp + LIBRARIES + Qt::CorePrivate Qt::Test ) - -#### Keys ignored in scope 1:.:.:qmutex.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/thread/qmutex/tst_qmutex.cpp b/tests/benchmarks/corelib/thread/qmutex/tst_bench_qmutex.cpp index 9cea995433..6ea0c25c0b 100644 --- a/tests/benchmarks/corelib/thread/qmutex/tst_qmutex.cpp +++ b/tests/benchmarks/corelib/thread/qmutex/tst_bench_qmutex.cpp @@ -1,38 +1,16 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QtCore/QtCore> #include <QTest> +#include <QtCore/private/qvolatile_p.h> #include <math.h> //#define USE_SEM_T +using namespace std::chrono_literals; + #if defined(Q_OS_UNIX) #if !defined(USE_SEM_T) # include <pthread.h> @@ -75,8 +53,7 @@ void NativeMutexUnlock(NativeMutexType *mutex) } #endif #elif defined(Q_OS_WIN) -# define _WIN32_WINNT 0x0400 -# include <windows.h> +# include <qt_windows.h> typedef CRITICAL_SECTION NativeMutexType; void NativeMutexInitialize(NativeMutexType *mutex) { @@ -158,7 +135,7 @@ void tst_QMutex::noThread() QBENCHMARK { count = 0; for (int i = 0; i < N; i++) { - count++; + QtPrivate::volatilePreIncrement(count); } } break; @@ -167,7 +144,7 @@ void tst_QMutex::noThread() count = 0; for (int i = 0; i < N; i++) { mtx.lock(); - count++; + QtPrivate::volatilePreIncrement(count); mtx.unlock(); } } @@ -177,7 +154,7 @@ void tst_QMutex::noThread() count = 0; for (int i = 0; i < N; i++) { QMutexLocker locker(&mtx); - count++; + QtPrivate::volatilePreIncrement(count); } } break; @@ -253,7 +230,8 @@ void tst_QMutex::contendedNative_data() class NativeMutexThread : public QThread { NativeMutexType *mutex1, *mutex2; - int iterations, msleepDuration; + int iterations; + std::chrono::milliseconds msleepDuration; bool use2mutexes; public: bool done; @@ -271,8 +249,8 @@ public: NativeMutexLock(mutex1); if (use2mutexes) NativeMutexLock(mutex2); - if (msleepDuration >= 0) - msleep(msleepDuration); + if (msleepDuration >= 0ms) + sleep(msleepDuration); if (use2mutexes) NativeMutexUnlock(mutex2); NativeMutexUnlock(mutex1); @@ -296,7 +274,7 @@ void tst_QMutex::contendedNative() NativeMutexInitialize(&mutex2); QList<NativeMutexThread *> threads(threadCount); - for (int i = 0; i < threads.count(); ++i) { + for (int i = 0; i < threads.size(); ++i) { threads[i] = new NativeMutexThread(&mutex1, &mutex2, iterations, msleepDuration, use2mutexes); threads[i]->start(); } @@ -308,11 +286,11 @@ void tst_QMutex::contendedNative() semaphore4.release(threadCount); } - for (int i = 0; i < threads.count(); ++i) + for (int i = 0; i < threads.size(); ++i) threads[i]->done = true; semaphore1.acquire(threadCount); semaphore2.release(threadCount); - for (int i = 0; i < threads.count(); ++i) + for (int i = 0; i < threads.size(); ++i) threads[i]->wait(); qDeleteAll(threads); @@ -323,7 +301,8 @@ void tst_QMutex::contendedNative() class QMutexThread : public QThread { QMutex *mutex1, *mutex2; - int iterations, msleepDuration; + int iterations; + std::chrono::milliseconds msleepDuration; bool use2mutexes; public: bool done; @@ -341,8 +320,8 @@ public: mutex1->lock(); if (use2mutexes) mutex2->lock(); - if (msleepDuration >= 0) - msleep(msleepDuration); + if (msleepDuration >= 0ms) + sleep(msleepDuration); if (use2mutexes) mutex2->unlock(); mutex1->unlock(); @@ -364,7 +343,7 @@ void tst_QMutex::contendedQMutex() QMutex mutex1, mutex2; QList<QMutexThread *> threads(threadCount); - for (int i = 0; i < threads.count(); ++i) { + for (int i = 0; i < threads.size(); ++i) { threads[i] = new QMutexThread(&mutex1, &mutex2, iterations, msleepDuration, use2mutexes); threads[i]->start(); } @@ -376,11 +355,11 @@ void tst_QMutex::contendedQMutex() semaphore4.release(threadCount); } - for (int i = 0; i < threads.count(); ++i) + for (int i = 0; i < threads.size(); ++i) threads[i]->done = true; semaphore1.acquire(threadCount); semaphore2.release(threadCount); - for (int i = 0; i < threads.count(); ++i) + for (int i = 0; i < threads.size(); ++i) threads[i]->wait(); qDeleteAll(threads); } @@ -388,7 +367,8 @@ void tst_QMutex::contendedQMutex() class QMutexLockerThread : public QThread { QMutex *mutex1, *mutex2; - int iterations, msleepDuration; + int iterations; + std::chrono::milliseconds msleepDuration; bool use2mutexes; public: bool done; @@ -406,8 +386,8 @@ public: { QMutexLocker locker1(mutex1); QMutexLocker locker2(use2mutexes ? mutex2 : 0); - if (msleepDuration >= 0) - msleep(msleepDuration); + if (msleepDuration >= 0ms) + sleep(msleepDuration); } QThread::yieldCurrentThread(); @@ -427,7 +407,7 @@ void tst_QMutex::contendedQMutexLocker() QMutex mutex1, mutex2; QList<QMutexLockerThread *> threads(threadCount); - for (int i = 0; i < threads.count(); ++i) { + for (int i = 0; i < threads.size(); ++i) { threads[i] = new QMutexLockerThread(&mutex1, &mutex2, iterations, msleepDuration, use2mutexes); threads[i]->start(); } @@ -439,14 +419,15 @@ void tst_QMutex::contendedQMutexLocker() semaphore4.release(threadCount); } - for (int i = 0; i < threads.count(); ++i) + for (int i = 0; i < threads.size(); ++i) threads[i]->done = true; semaphore1.acquire(threadCount); semaphore2.release(threadCount); - for (int i = 0; i < threads.count(); ++i) + for (int i = 0; i < threads.size(); ++i) threads[i]->wait(); qDeleteAll(threads); } QTEST_MAIN(tst_QMutex) -#include "tst_qmutex.moc" + +#include "tst_bench_qmutex.moc" diff --git a/tests/benchmarks/corelib/thread/qreadwritelock/CMakeLists.txt b/tests/benchmarks/corelib/thread/qreadwritelock/CMakeLists.txt index 79d3a2f879..b56f484b48 100644 --- a/tests/benchmarks/corelib/thread/qreadwritelock/CMakeLists.txt +++ b/tests/benchmarks/corelib/thread/qreadwritelock/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qreadwritelock.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qreadwritelock Binary: @@ -6,11 +7,8 @@ qt_internal_add_benchmark(tst_bench_qreadwritelock SOURCES - tst_qreadwritelock.cpp - PUBLIC_LIBRARIES + tst_bench_qreadwritelock.cpp + LIBRARIES Qt::CorePrivate Qt::Test ) - -#### Keys ignored in scope 1:.:.:qreadwritelock.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/thread/qreadwritelock/tst_qreadwritelock.cpp b/tests/benchmarks/corelib/thread/qreadwritelock/tst_bench_qreadwritelock.cpp index 1018dae878..e63ac6573f 100644 --- a/tests/benchmarks/corelib/thread/qreadwritelock/tst_qreadwritelock.cpp +++ b/tests/benchmarks/corelib/thread/qreadwritelock/tst_bench_qreadwritelock.cpp @@ -1,39 +1,12 @@ -/**************************************************************************** -** -** Copyright (C) 2016 Olivier Goffart <ogoffart@woboq.com> -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 Olivier Goffart <ogoffart@woboq.com> +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QtCore/QtCore> #include <QTest> #include <mutex> #if __has_include(<shared_mutex>) -#if __cplusplus > 201103L #include <shared_mutex> #endif -#endif #include <vector> // Wrapers that take pointers instead of reference to have the same interface as Qt @@ -46,6 +19,49 @@ struct LockerWrapper : T } }; +struct QRecursiveReadWriteLock : QReadWriteLock +{ + QRecursiveReadWriteLock() : QReadWriteLock(Recursive) {} +}; + +template <typename T, size_t N> + // requires N = 2^M for some Integral M >= 0 +struct Recursive +{ + Recursive<T, N/2> r1, r2; + + template <typename...Args> + Q_ALWAYS_INLINE + explicit Recursive(Args &&...args) + : r1(args...), + r2(args...) + {} +}; + +template <typename T> +struct Recursive<T, 1> +{ + T t; + template <typename...Args> + Q_ALWAYS_INLINE + explicit Recursive(Args &&...args) + : t(args...) {} +}; + +template <typename T> +struct Recursive<T, 0> +{ + template <typename...Args> + Q_ALWAYS_INLINE + explicit Recursive(Args &&...) {} +}; + +template <size_t N> +using QRecursiveReadLocker = Recursive<QReadLocker, N>; + +template <size_t N> +using QRecursiveWriteLocker = Recursive<QWriteLocker, N>; + int threadCount; class tst_QReadWriteLock : public QObject @@ -107,6 +123,15 @@ void tst_QReadWriteLock::uncontended_data() << FunctionPtrHolder(testUncontended<QReadWriteLock, QReadLocker>); QTest::newRow("QReadWriteLock, write") << FunctionPtrHolder(testUncontended<QReadWriteLock, QWriteLocker>); +#define ROW(n) \ + QTest::addRow("QReadWriteLock, %s, recursive: %d", "read", n) \ + << FunctionPtrHolder(testUncontended<QRecursiveReadWriteLock, QRecursiveReadLocker<n>>); \ + QTest::addRow("QReadWriteLock, %s, recursive: %d", "write", n) \ + << FunctionPtrHolder(testUncontended<QRecursiveReadWriteLock, QRecursiveWriteLocker<n>>) + ROW(1); + ROW(2); + ROW(32); +#undef ROW QTest::newRow("std::mutex") << FunctionPtrHolder( testUncontended<std::mutex, LockerWrapper<std::unique_lock<std::mutex>>>); #ifdef __cpp_lib_shared_mutex @@ -174,6 +199,13 @@ void tst_QReadWriteLock::readOnly_data() QTest::newRow("nothing") << FunctionPtrHolder(testReadOnly<int, FakeLock>); QTest::newRow("QMutex") << FunctionPtrHolder(testReadOnly<QMutex, QMutexLocker<QMutex>>); QTest::newRow("QReadWriteLock") << FunctionPtrHolder(testReadOnly<QReadWriteLock, QReadLocker>); +#define ROW(n) \ + QTest::addRow("QReadWriteLock, recursive: %d", n) \ + << FunctionPtrHolder(testReadOnly<QRecursiveReadWriteLock, QRecursiveReadLocker<n>>) + ROW(1); + ROW(2); + ROW(32); +#undef ROW QTest::newRow("std::mutex") << FunctionPtrHolder( testReadOnly<std::mutex, LockerWrapper<std::unique_lock<std::mutex>>>); #ifdef __cpp_lib_shared_mutex @@ -235,6 +267,13 @@ void tst_QReadWriteLock::writeOnly_data() // QTest::newRow("nothing") << FunctionPtrHolder(testWriteOnly<int, FakeLock>); QTest::newRow("QMutex") << FunctionPtrHolder(testWriteOnly<QMutex, QMutexLocker<QMutex>>); QTest::newRow("QReadWriteLock") << FunctionPtrHolder(testWriteOnly<QReadWriteLock, QWriteLocker>); +#define ROW(n) \ + QTest::addRow("QReadWriteLock, recursive: %d", n) \ + << FunctionPtrHolder(testWriteOnly<QRecursiveReadWriteLock, QRecursiveWriteLocker<n>>) + ROW(1); + ROW(2); + ROW(32); +#undef ROW QTest::newRow("std::mutex") << FunctionPtrHolder( testWriteOnly<std::mutex, LockerWrapper<std::unique_lock<std::mutex>>>); #ifdef __cpp_lib_shared_mutex @@ -256,4 +295,4 @@ void tst_QReadWriteLock::writeOnly() } QTEST_MAIN(tst_QReadWriteLock) -#include "tst_qreadwritelock.moc" +#include "tst_bench_qreadwritelock.moc" diff --git a/tests/benchmarks/corelib/thread/qthreadpool/CMakeLists.txt b/tests/benchmarks/corelib/thread/qthreadpool/CMakeLists.txt index 7b0c81891e..1353eaa2c4 100644 --- a/tests/benchmarks/corelib/thread/qthreadpool/CMakeLists.txt +++ b/tests/benchmarks/corelib/thread/qthreadpool/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qthreadpool.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qthreadpool Binary: @@ -6,10 +7,7 @@ qt_internal_add_benchmark(tst_bench_qthreadpool SOURCES - tst_qthreadpool.cpp - PUBLIC_LIBRARIES + tst_bench_qthreadpool.cpp + LIBRARIES Qt::Test ) - -#### Keys ignored in scope 1:.:.:qthreadpool.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/thread/qthreadpool/tst_bench_qthreadpool.cpp b/tests/benchmarks/corelib/thread/qthreadpool/tst_bench_qthreadpool.cpp new file mode 100644 index 0000000000..e7e5636307 --- /dev/null +++ b/tests/benchmarks/corelib/thread/qthreadpool/tst_bench_qthreadpool.cpp @@ -0,0 +1,55 @@ +// Copyright (C) 2013 David Faure <david.faure@kdab.com> +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <qtest.h> +#include <QtCore> + +class tst_QThreadPool : public QObject +{ + Q_OBJECT + +public: + tst_QThreadPool(); + ~tst_QThreadPool(); + +private slots: + void startRunnables(); + void activeThreadCount(); +}; + +tst_QThreadPool::tst_QThreadPool() +{ +} + +tst_QThreadPool::~tst_QThreadPool() +{ +} + +class NoOpRunnable : public QRunnable +{ +public: + void run() override { + } +}; + +void tst_QThreadPool::startRunnables() +{ + QThreadPool threadPool; + threadPool.setMaxThreadCount(10); + QBENCHMARK { + threadPool.start(new NoOpRunnable()); + } +} + +void tst_QThreadPool::activeThreadCount() +{ + QThreadPool threadPool; + threadPool.start(new NoOpRunnable()); + QBENCHMARK { + QVERIFY(threadPool.activeThreadCount() <= 10); + } +} + +QTEST_MAIN(tst_QThreadPool) + +#include "tst_bench_qthreadpool.moc" diff --git a/tests/benchmarks/corelib/thread/qthreadpool/tst_qthreadpool.cpp b/tests/benchmarks/corelib/thread/qthreadpool/tst_qthreadpool.cpp deleted file mode 100644 index 10928e3afc..0000000000 --- a/tests/benchmarks/corelib/thread/qthreadpool/tst_qthreadpool.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 David Faure <david.faure@kdab.com> -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <qtest.h> -#include <QtCore> - -class tst_QThreadPool : public QObject -{ - Q_OBJECT - -public: - tst_QThreadPool(); - ~tst_QThreadPool(); - -private slots: - void startRunnables(); - void activeThreadCount(); -}; - -tst_QThreadPool::tst_QThreadPool() -{ -} - -tst_QThreadPool::~tst_QThreadPool() -{ -} - -class NoOpRunnable : public QRunnable -{ -public: - void run() override { - } -}; - -void tst_QThreadPool::startRunnables() -{ - QThreadPool threadPool; - threadPool.setMaxThreadCount(10); - QBENCHMARK { - threadPool.start(new NoOpRunnable()); - } -} - -void tst_QThreadPool::activeThreadCount() -{ - QThreadPool threadPool; - threadPool.start(new NoOpRunnable()); - QBENCHMARK { - QVERIFY(threadPool.activeThreadCount() <= 10); - } -} - -QTEST_MAIN(tst_QThreadPool) -#include "tst_qthreadpool.moc" diff --git a/tests/benchmarks/corelib/thread/qthreadstorage/CMakeLists.txt b/tests/benchmarks/corelib/thread/qthreadstorage/CMakeLists.txt index 78ac072d35..916a2d8dee 100644 --- a/tests/benchmarks/corelib/thread/qthreadstorage/CMakeLists.txt +++ b/tests/benchmarks/corelib/thread/qthreadstorage/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qthreadstorage.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qthreadstorage Binary: @@ -6,10 +7,7 @@ qt_internal_add_benchmark(tst_bench_qthreadstorage SOURCES - tst_qthreadstorage.cpp - PUBLIC_LIBRARIES + tst_bench_qthreadstorage.cpp + LIBRARIES Qt::Test ) - -#### Keys ignored in scope 1:.:.:qthreadstorage.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/thread/qthreadstorage/tst_bench_qthreadstorage.cpp b/tests/benchmarks/corelib/thread/qthreadstorage/tst_bench_qthreadstorage.cpp new file mode 100644 index 0000000000..47db215465 --- /dev/null +++ b/tests/benchmarks/corelib/thread/qthreadstorage/tst_bench_qthreadstorage.cpp @@ -0,0 +1,85 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <qtest.h> +#include <QtCore> + +QThreadStorage<int *> dummy[8]; + +QThreadStorage<QString *> tls1; + +class tst_QThreadStorage : public QObject +{ + Q_OBJECT + +public: + tst_QThreadStorage(); + virtual ~tst_QThreadStorage(); + +public slots: + void init(); + void cleanup(); + +private slots: + void construct(); + void get(); + void set(); +}; + +tst_QThreadStorage::tst_QThreadStorage() +{ +} + +tst_QThreadStorage::~tst_QThreadStorage() +{ +} + +void tst_QThreadStorage::init() +{ + dummy[1].setLocalData(new int(5)); + dummy[2].setLocalData(new int(4)); + dummy[3].setLocalData(new int(3)); + tls1.setLocalData(new QString()); +} + +void tst_QThreadStorage::cleanup() +{ +} + +void tst_QThreadStorage::construct() +{ + QBENCHMARK { + QThreadStorage<int *> ts; + } +} + + +void tst_QThreadStorage::get() +{ + QThreadStorage<int *> ts; + ts.setLocalData(new int(45)); + + int count = 0; + QBENCHMARK { + int *i = ts.localData(); + count += *i; + } + QVERIFY(count > 0); + ts.setLocalData(0); +} + +void tst_QThreadStorage::set() +{ + QThreadStorage<int *> ts; + + int count = 0; + QBENCHMARK { + ts.setLocalData(new int(count)); + count++; + } + ts.setLocalData(0); +} + +QTEST_MAIN(tst_QThreadStorage) + +#include "tst_bench_qthreadstorage.moc" diff --git a/tests/benchmarks/corelib/thread/qthreadstorage/tst_qthreadstorage.cpp b/tests/benchmarks/corelib/thread/qthreadstorage/tst_qthreadstorage.cpp deleted file mode 100644 index c8f9f23c76..0000000000 --- a/tests/benchmarks/corelib/thread/qthreadstorage/tst_qthreadstorage.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <qtest.h> -#include <QtCore> - -QThreadStorage<int *> dummy[8]; - -QThreadStorage<QString *> tls1; - -class tst_QThreadStorage : public QObject -{ - Q_OBJECT - -public: - tst_QThreadStorage(); - virtual ~tst_QThreadStorage(); - -public slots: - void init(); - void cleanup(); - -private slots: - void construct(); - void get(); - void set(); -}; - -tst_QThreadStorage::tst_QThreadStorage() -{ -} - -tst_QThreadStorage::~tst_QThreadStorage() -{ -} - -void tst_QThreadStorage::init() -{ - dummy[1].setLocalData(new int(5)); - dummy[2].setLocalData(new int(4)); - dummy[3].setLocalData(new int(3)); - tls1.setLocalData(new QString()); -} - -void tst_QThreadStorage::cleanup() -{ -} - -void tst_QThreadStorage::construct() -{ - QBENCHMARK { - QThreadStorage<int *> ts; - } -} - - -void tst_QThreadStorage::get() -{ - QThreadStorage<int *> ts; - ts.setLocalData(new int(45)); - - int count = 0; - QBENCHMARK { - int *i = ts.localData(); - count += *i; - } - ts.setLocalData(0); -} - -void tst_QThreadStorage::set() -{ - QThreadStorage<int *> ts; - - int count = 0; - QBENCHMARK { - ts.setLocalData(new int(count)); - count++; - } - ts.setLocalData(0); -} - - -QTEST_MAIN(tst_QThreadStorage) -#include "tst_qthreadstorage.moc" diff --git a/tests/benchmarks/corelib/thread/qwaitcondition/CMakeLists.txt b/tests/benchmarks/corelib/thread/qwaitcondition/CMakeLists.txt index 68c6e88342..c7a15f9e8a 100644 --- a/tests/benchmarks/corelib/thread/qwaitcondition/CMakeLists.txt +++ b/tests/benchmarks/corelib/thread/qwaitcondition/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qwaitcondition.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qwaitcondition Binary: @@ -6,10 +7,7 @@ qt_internal_add_benchmark(tst_bench_qwaitcondition SOURCES - tst_qwaitcondition.cpp - PUBLIC_LIBRARIES + tst_bench_qwaitcondition.cpp + LIBRARIES Qt::Test ) - -#### Keys ignored in scope 1:.:.:qwaitcondition.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/thread/qwaitcondition/tst_bench_qwaitcondition.cpp b/tests/benchmarks/corelib/thread/qwaitcondition/tst_bench_qwaitcondition.cpp new file mode 100644 index 0000000000..0abd53fc93 --- /dev/null +++ b/tests/benchmarks/corelib/thread/qwaitcondition/tst_bench_qwaitcondition.cpp @@ -0,0 +1,174 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QtCore/QtCore> +#include <QTest> + +#include <math.h> +#include <condition_variable> +#include <mutex> + +#include <limits.h> + +using namespace std::chrono_literals; + +class tst_QWaitCondition : public QObject +{ + Q_OBJECT + +public: + tst_QWaitCondition() + { + } + +private slots: + void oscillate_QWaitCondition_QMutex_data() { oscillate_mutex_data(); } + void oscillate_QWaitCondition_QMutex(); + void oscillate_QWaitCondition_QReadWriteLock_data() { oscillate_mutex_data(); } + void oscillate_QWaitCondition_QReadWriteLock(); + void oscillate_std_condition_variable_std_mutex_data() { oscillate_mutex_data(); } + void oscillate_std_condition_variable_std_mutex(); + void oscillate_std_condition_variable_any_QMutex_data() { oscillate_mutex_data(); } + void oscillate_std_condition_variable_any_QMutex(); + void oscillate_std_condition_variable_any_QReadWriteLock_data() { oscillate_mutex_data(); } + void oscillate_std_condition_variable_any_QReadWriteLock(); + +private: + void oscillate_mutex_data(); +}; + + +int turn; +const int threadCount = 10; +QWaitCondition cond; +std::condition_variable cv; +std::condition_variable_any cva; + +template <typename Cond> +Cond *get(); + +template <> std::condition_variable *get() { return &cv; } +template <> std::condition_variable_any *get() { return &cva; } + +template <class Cond, class Mutex, class Locker> +class OscillateThread : public QThread +{ +public: + Mutex *mutex; + int m_threadid; + unsigned long timeout; + + void run() override + { + for (int count = 0; count < 5000; ++count) { + Locker lock(*mutex); + while (m_threadid != turn) { + if (timeout == ULONG_MAX) + get<Cond>()->wait(lock); + else if (timeout == 0) // Windows doesn't unlock the mutex with a zero timeout + get<Cond>()->wait_for(lock, 1ns); + else + get<Cond>()->wait_for(lock, timeout * 1ms); + } + turn = (turn+1) % threadCount; + get<Cond>()->notify_all(); + } + } +}; + +template <class Mutex, class Locker> +class OscillateThread<QWaitCondition, Mutex, Locker> : public QThread +{ +public: + Mutex *mutex; + int m_threadid; + unsigned long timeout; + + void run() override + { + for (int count = 0; count < 5000; ++count) { + + Locker lock(mutex); + while (m_threadid != turn) { + cond.wait(mutex, timeout); + } + turn = (turn+1) % threadCount; + cond.wakeAll(); + } + } +}; + +template <class Cond, class Mutex, class Locker> +void oscillate(unsigned long timeout) { + + OscillateThread<Cond, Mutex, Locker> thrd[threadCount]; + Mutex m; + for (int i = 0; i < threadCount; ++i) { + thrd[i].mutex = &m; + thrd[i].m_threadid = i; + thrd[i].timeout = timeout; + } + + QBENCHMARK { + for (int i = 0; i < threadCount; ++i) { + thrd[i].start(); + } + for (int i = 0; i < threadCount; ++i) { + thrd[i].wait(); + } + } + +} + +void tst_QWaitCondition::oscillate_mutex_data() +{ + QTest::addColumn<unsigned long>("timeout"); + + QTest::newRow("0") << 0ul; + QTest::newRow("1") << 1ul; + QTest::newRow("1000") << 1000ul; + QTest::newRow("forever") << ULONG_MAX; +} + +void tst_QWaitCondition::oscillate_QWaitCondition_QMutex() +{ + QFETCH(unsigned long, timeout); + oscillate<QWaitCondition, QMutex, QMutexLocker<QMutex>>(timeout); +} + +void tst_QWaitCondition::oscillate_QWaitCondition_QReadWriteLock() +{ + QFETCH(unsigned long, timeout); + oscillate<QWaitCondition, QReadWriteLock, QWriteLocker>(timeout); +} + +void tst_QWaitCondition::oscillate_std_condition_variable_std_mutex() +{ + QFETCH(unsigned long, timeout); + oscillate<std::condition_variable, std::mutex, std::unique_lock<std::mutex>>(timeout); +} + + +void tst_QWaitCondition::oscillate_std_condition_variable_any_QMutex() +{ + QFETCH(unsigned long, timeout); + oscillate<std::condition_variable_any, QMutex, std::unique_lock<QMutex>>(timeout); +} + + +void tst_QWaitCondition::oscillate_std_condition_variable_any_QReadWriteLock() +{ + QFETCH(unsigned long, timeout); + + struct WriteLocker : QWriteLocker { + // adapt to BasicLockable + explicit WriteLocker(QReadWriteLock &m) : QWriteLocker{&m} {} + void lock() { relock(); } + }; + + oscillate<std::condition_variable_any, QReadWriteLock, WriteLocker>(timeout); +} + +QTEST_MAIN(tst_QWaitCondition) + +#include "tst_bench_qwaitcondition.moc" diff --git a/tests/benchmarks/corelib/thread/qwaitcondition/tst_qwaitcondition.cpp b/tests/benchmarks/corelib/thread/qwaitcondition/tst_qwaitcondition.cpp deleted file mode 100644 index b87da463dc..0000000000 --- a/tests/benchmarks/corelib/thread/qwaitcondition/tst_qwaitcondition.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtCore/QtCore> -#include <QTest> - -#include <math.h> - - -class tst_QWaitCondition : public QObject -{ - Q_OBJECT - -public: - tst_QWaitCondition() - { - } - -private slots: - void oscillate_mutex_data(); - void oscillate_mutex(); - void oscillate_writelock_data(); - void oscillate_writelock(); -}; - - -int turn; -const int threadCount = 10; -QWaitCondition cond; - -template <class Mutex, class Locker> -class OscillateThread : public QThread -{ -public: - Mutex *mutex; - int m_threadid; - int timeout; - - void run() override - { - for (int count = 0; count < 5000; ++count) { - - Locker lock(mutex); - while (m_threadid != turn) { - cond.wait(mutex, timeout); - } - turn = (turn+1) % threadCount; - cond.wakeAll(); - } - } -}; - -template <class Mutex, class Locker> -void oscillate(unsigned long timeout) { - - OscillateThread<Mutex, Locker> thrd[threadCount]; - Mutex m; - for (int i = 0; i < threadCount; ++i) { - thrd[i].mutex = &m; - thrd[i].m_threadid = i; - thrd[i].timeout = timeout; - } - - QBENCHMARK { - for (int i = 0; i < threadCount; ++i) { - thrd[i].start(); - } - for (int i = 0; i < threadCount; ++i) { - thrd[i].wait(); - } - } - -} - -void tst_QWaitCondition::oscillate_mutex_data() -{ - QTest::addColumn<unsigned long>("timeout"); - - QTest::newRow("0") << 0ul; - QTest::newRow("1") << 1ul; - QTest::newRow("1000") << 1000ul; - QTest::newRow("forever") << ULONG_MAX; -} - -void tst_QWaitCondition::oscillate_mutex() -{ - QFETCH(unsigned long, timeout); - oscillate<QMutex, QMutexLocker<QMutex>>(timeout); -} - -void tst_QWaitCondition::oscillate_writelock_data() -{ - oscillate_mutex_data(); -} - -void tst_QWaitCondition::oscillate_writelock() -{ - QFETCH(unsigned long, timeout); - oscillate<QReadWriteLock, QWriteLocker>(timeout); -} - - -QTEST_MAIN(tst_QWaitCondition) -#include "tst_qwaitcondition.moc" diff --git a/tests/benchmarks/corelib/time/CMakeLists.txt b/tests/benchmarks/corelib/time/CMakeLists.txt index 086650edb6..7c9de68486 100644 --- a/tests/benchmarks/corelib/time/CMakeLists.txt +++ b/tests/benchmarks/corelib/time/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from time.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause add_subdirectory(qdate) add_subdirectory(qdatetime) diff --git a/tests/benchmarks/corelib/time/qdate/CMakeLists.txt b/tests/benchmarks/corelib/time/qdate/CMakeLists.txt index edc55463d8..e4ef5e3edc 100644 --- a/tests/benchmarks/corelib/time/qdate/CMakeLists.txt +++ b/tests/benchmarks/corelib/time/qdate/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qdate.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qdate Binary: @@ -7,6 +8,6 @@ qt_internal_add_benchmark(tst_bench_qdate SOURCES tst_bench_qdate.cpp - PUBLIC_LIBRARIES + LIBRARIES Qt::Test ) diff --git a/tests/benchmarks/corelib/time/qdate/tst_bench_qdate.cpp b/tests/benchmarks/corelib/time/qdate/tst_bench_qdate.cpp index 196289148a..7dde3bf426 100644 --- a/tests/benchmarks/corelib/time/qdate/tst_bench_qdate.cpp +++ b/tests/benchmarks/corelib/time/qdate/tst_bench_qdate.cpp @@ -1,34 +1,10 @@ -/**************************************************************************** -** -** Copyright (C) 2019 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2019 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QDate> #include <QTest> #include <QList> +using namespace Qt::StringLiterals; class tst_QDate : public QObject { @@ -58,6 +34,9 @@ private Q_SLOTS: void addDays(); void addMonths(); void addYears(); + + void fromString_data(); + void fromString(); }; QList<QDate> tst_QDate::daily(qint64 start, qint64 end) @@ -209,5 +188,28 @@ void tst_QDate::addYears() Q_UNUSED(store); } +void tst_QDate::fromString_data() +{ + QTest::addColumn<QString>("string"); + QTest::addColumn<QString>("format"); + QTest::addColumn<int>("baseYear"); + + QTest::newRow("yyyyMMdd") << u"20240412"_s << u"yyyyMMdd"_s << 2000; + QTest::newRow("yyyy-MM-dd") << u"2024-04-12"_s << u"yyyy-MM-dd"_s << 2000; + QTest::newRow("YYYYMMDD") << u"20240412"_s << u"YYYYMMDD"_s << 2000; // Invalid, QTBUG-124465. +} + +void tst_QDate::fromString() +{ + QFETCH(const QString, string); + QFETCH(const QString, format); + QFETCH(const int, baseYear); + QDate date; + QBENCHMARK { + date = QDate::fromString(string, format, baseYear); + } + Q_UNUSED(date); +} + QTEST_MAIN(tst_QDate) #include "tst_bench_qdate.moc" diff --git a/tests/benchmarks/corelib/time/qdatetime/CMakeLists.txt b/tests/benchmarks/corelib/time/qdatetime/CMakeLists.txt index 2585b0d25d..14c0b9c730 100644 --- a/tests/benchmarks/corelib/time/qdatetime/CMakeLists.txt +++ b/tests/benchmarks/corelib/time/qdatetime/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qdatetime.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qdatetime Binary: @@ -6,7 +7,8 @@ qt_internal_add_benchmark(tst_bench_qdatetime SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qdatetime.cpp + LIBRARIES Qt::Test + Qt::CorePrivate ) diff --git a/tests/benchmarks/corelib/time/qdatetime/main.cpp b/tests/benchmarks/corelib/time/qdatetime/tst_bench_qdatetime.cpp index c6d2b84597..1c86eae009 100644 --- a/tests/benchmarks/corelib/time/qdatetime/main.cpp +++ b/tests/benchmarks/corelib/time/qdatetime/tst_bench_qdatetime.cpp @@ -1,59 +1,25 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QDateTime> #include <QTimeZone> #include <QTest> #include <QList> #include <qdebug.h> +#include <QtCore/private/qdatetime_p.h> class tst_QDateTime : public QObject { Q_OBJECT - enum : qint64 - { - SECS_PER_DAY = 86400, - MSECS_PER_DAY = 86400000, - JULIAN_DAY_1950 = 2433283, - JULIAN_DAY_1960 = 2436935, - JULIAN_DAY_1970 = 2440588, // Epoch - JULIAN_DAY_2010 = 2455198, - JULIAN_DAY_2011 = 2455563, - JULIAN_DAY_2020 = 2458850, - JULIAN_DAY_2050 = 2469808, - JULIAN_DAY_2060 = 2473460 - }; - static QList<QDateTime> daily(qint64 start, qint64 end); +#if QT_CONFIG(timezone) static QList<QDateTime> norse(qint64 start, qint64 end); +#endif + void decade_data(); private Q_SLOTS: + void create_data() { decade_data(); } void create(); void isNull(); void isValid(); @@ -62,27 +28,35 @@ private Q_SLOTS: void timeSpec(); void offsetFromUtc(); void timeZoneAbbreviation(); + void toMSecsSinceEpoch_data() { decade_data(); } void toMSecsSinceEpoch(); - void toMSecsSinceEpoch1950(); - void toMSecsSinceEpoch2050(); +#if QT_CONFIG(timezone) + void toMSecsSinceEpochTz_data() { decade_data(); } void toMSecsSinceEpochTz(); - void toMSecsSinceEpoch1950Tz(); - void toMSecsSinceEpoch2050Tz(); +#endif void setDate(); void setTime(); +#if QT_DEPRECATED_SINCE(6, 9) void setTimeSpec(); void setOffsetFromUtc(); +#endif void setMSecsSinceEpoch(); +#if QT_CONFIG(timezone) void setMSecsSinceEpochTz(); +#endif void toString(); void toStringTextFormat(); void toStringIsoFormat(); void addDays(); +#if QT_CONFIG(timezone) void addDaysTz(); - void addMSecs(); void addMSecsTz(); +#endif + void addMSecs(); +#if QT_DEPRECATED_SINCE(6, 9) void toTimeSpec(); void toOffsetFromUtc(); +#endif void daysTo(); void msecsTo(); void equivalent(); @@ -99,33 +73,64 @@ private Q_SLOTS: void fromStringIso(); void fromMSecsSinceEpoch(); void fromMSecsSinceEpochUtc(); +#if QT_CONFIG(timezone) void fromMSecsSinceEpochTz(); +#endif }; +using namespace QtPrivate::DateTimeConstants; +constexpr qint64 JULIAN_DAY_1 = 1721426; +constexpr qint64 JULIAN_DAY_11 = 1725078; +constexpr qint64 JULIAN_DAY_1890 = 2411369; +constexpr qint64 JULIAN_DAY_1900 = 2415021; +constexpr qint64 JULIAN_DAY_1950 = 2433283; +constexpr qint64 JULIAN_DAY_1960 = 2436935; +constexpr qint64 JULIAN_DAY_1970 = 2440588; // Epoch +constexpr qint64 JULIAN_DAY_2010 = 2455198; +constexpr qint64 JULIAN_DAY_2011 = 2455563; +constexpr qint64 JULIAN_DAY_2020 = 2458850; +constexpr qint64 JULIAN_DAY_2050 = 2469808; +constexpr qint64 JULIAN_DAY_2060 = 2473460; + +void tst_QDateTime::decade_data() +{ + QTest::addColumn<qint64>("startJd"); + QTest::addColumn<qint64>("stopJd"); + + QTest::newRow("first-decade-CE") << JULIAN_DAY_1 << JULIAN_DAY_11; + QTest::newRow("1890s") << JULIAN_DAY_1890 << JULIAN_DAY_1900; + QTest::newRow("1950s") << JULIAN_DAY_1950 << JULIAN_DAY_1960; + QTest::newRow("2010s") << JULIAN_DAY_2010 << JULIAN_DAY_2020; + QTest::newRow("2050s") << JULIAN_DAY_2050 << JULIAN_DAY_2060; +} + QList<QDateTime> tst_QDateTime::daily(qint64 start, qint64 end) { QList<QDateTime> list; list.reserve(end - start); for (int jd = start; jd < end; ++jd) - list.append(QDateTime(QDate::fromJulianDay(jd), QTime::fromMSecsSinceStartOfDay(0))); + list.append(QDateTime(QDate::fromJulianDay(jd).startOfDay())); return list; } - +#if QT_CONFIG(timezone) QList<QDateTime> tst_QDateTime::norse(qint64 start, qint64 end) { const QTimeZone cet("Europe/Oslo"); QList<QDateTime> list; list.reserve(end - start); for (int jd = start; jd < end; ++jd) - list.append(QDateTime(QDate::fromJulianDay(jd), QTime::fromMSecsSinceStartOfDay(0), cet)); + list.append(QDateTime(QDate::fromJulianDay(jd).startOfDay(cet))); return list; } - +#endif void tst_QDateTime::create() { + QFETCH(const qint64, startJd); + QFETCH(const qint64, stopJd); + const QTime noon = QTime::fromMSecsSinceStartOfDay(43200); QBENCHMARK { - for (int jd = JULIAN_DAY_2010; jd < JULIAN_DAY_2020; ++jd) { - QDateTime test(QDate::fromJulianDay(jd), QTime::fromMSecsSinceStartOfDay(0)); + for (int jd = startJd; jd < stopJd; ++jd) { + QDateTime test(QDate::fromJulianDay(jd), noon); Q_UNUSED(test); } } @@ -196,64 +201,29 @@ void tst_QDateTime::timeZoneAbbreviation() void tst_QDateTime::toMSecsSinceEpoch() { - const auto list = daily(JULIAN_DAY_2010, JULIAN_DAY_2020); - QBENCHMARK { - for (const QDateTime &test : list) - test.toMSecsSinceEpoch(); - } -} - -void tst_QDateTime::toMSecsSinceEpoch1950() -{ - const auto list = daily(JULIAN_DAY_1950, JULIAN_DAY_1960); + QFETCH(const qint64, startJd); + QFETCH(const qint64, stopJd); + const auto list = daily(startJd, stopJd); QBENCHMARK { for (const QDateTime &test : list) test.toMSecsSinceEpoch(); } } - -void tst_QDateTime::toMSecsSinceEpoch2050() -{ - const auto list = daily(JULIAN_DAY_2050, JULIAN_DAY_2060); - QBENCHMARK { - for (const QDateTime &test : list) - test.toMSecsSinceEpoch(); - } -} - +#if QT_CONFIG(timezone) void tst_QDateTime::toMSecsSinceEpochTz() { - qint64 result; - const auto list = norse(JULIAN_DAY_2010, JULIAN_DAY_2020); - QBENCHMARK { - for (const QDateTime &test : list) - result = test.toMSecsSinceEpoch(); - } - Q_UNUSED(result); -} - -void tst_QDateTime::toMSecsSinceEpoch1950Tz() -{ - qint64 result; - const auto list = norse(JULIAN_DAY_1950, JULIAN_DAY_1960); - QBENCHMARK { - for (const QDateTime &test : list) - result = test.toMSecsSinceEpoch(); - } - Q_UNUSED(result); -} + QFETCH(const qint64, startJd); + QFETCH(const qint64, stopJd); + const auto list = norse(startJd, stopJd); -void tst_QDateTime::toMSecsSinceEpoch2050Tz() -{ qint64 result; - const auto list = norse(JULIAN_DAY_2050, JULIAN_DAY_2060); QBENCHMARK { for (const QDateTime &test : list) result = test.toMSecsSinceEpoch(); } Q_UNUSED(result); } - +#endif void tst_QDateTime::setDate() { const auto list = daily(JULIAN_DAY_2010, JULIAN_DAY_2020); @@ -272,6 +242,9 @@ void tst_QDateTime::setTime() } } +#if QT_DEPRECATED_SINCE(6, 9) +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED void tst_QDateTime::setTimeSpec() { const auto list = daily(JULIAN_DAY_2010, JULIAN_DAY_2020); @@ -289,6 +262,8 @@ void tst_QDateTime::setOffsetFromUtc() test.setOffsetFromUtc(3600); } } +QT_WARNING_POP +#endif // 6.9 deprecation void tst_QDateTime::setMSecsSinceEpoch() { @@ -299,7 +274,7 @@ void tst_QDateTime::setMSecsSinceEpoch() test.setMSecsSinceEpoch(msecs); } } - +#if QT_CONFIG(timezone) void tst_QDateTime::setMSecsSinceEpochTz() { const qint64 msecs = qint64(JULIAN_DAY_2010 - JULIAN_DAY_1970 + 180) * MSECS_PER_DAY; @@ -309,7 +284,7 @@ void tst_QDateTime::setMSecsSinceEpochTz() test.setMSecsSinceEpoch(msecs); } } - +#endif void tst_QDateTime::toString() { const auto list = daily(JULIAN_DAY_2010, JULIAN_DAY_2011); @@ -347,7 +322,7 @@ void tst_QDateTime::addDays() } Q_UNUSED(next); } - +#if QT_CONFIG(timezone) void tst_QDateTime::addDaysTz() { const auto list = norse(JULIAN_DAY_2010, JULIAN_DAY_2020); @@ -356,7 +331,7 @@ void tst_QDateTime::addDaysTz() QDateTime result = test.addDays(1); } } - +#endif void tst_QDateTime::addMSecs() { const auto list = daily(JULIAN_DAY_2010, JULIAN_DAY_2020); @@ -367,7 +342,7 @@ void tst_QDateTime::addMSecs() } Q_UNUSED(next); } - +#if QT_CONFIG(timezone) void tst_QDateTime::addMSecsTz() { const auto list = norse(JULIAN_DAY_2010, JULIAN_DAY_2020); @@ -376,7 +351,10 @@ void tst_QDateTime::addMSecsTz() QDateTime result = test.addMSecs(1); } } - +#endif +#if QT_DEPRECATED_SINCE(6, 9) +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED void tst_QDateTime::toTimeSpec() { const auto list = daily(JULIAN_DAY_2010, JULIAN_DAY_2020); @@ -394,6 +372,8 @@ void tst_QDateTime::toOffsetFromUtc() test.toOffsetFromUtc(3600); } } +QT_WARNING_POP +#endif void tst_QDateTime::daysTo() { @@ -434,7 +414,7 @@ void tst_QDateTime::equivalentUtc() { bool result = false; const QDateTime other = QDateTime::fromMSecsSinceEpoch( - qint64(JULIAN_DAY_2010 - JULIAN_DAY_1970) * MSECS_PER_DAY, Qt::UTC); + qint64(JULIAN_DAY_2010 - JULIAN_DAY_1970) * MSECS_PER_DAY, QTimeZone::UTC); const auto list = daily(JULIAN_DAY_2010, JULIAN_DAY_2020); QBENCHMARK { for (const QDateTime &test : list) @@ -460,7 +440,7 @@ void tst_QDateTime::lessThanUtc() { bool result = false; const QDateTime other = QDateTime::fromMSecsSinceEpoch( - qint64(JULIAN_DAY_2010 - JULIAN_DAY_1970) * MSECS_PER_DAY, Qt::UTC); + qint64(JULIAN_DAY_2010 - JULIAN_DAY_1970) * MSECS_PER_DAY, QTimeZone::UTC); const auto list = daily(JULIAN_DAY_2010, JULIAN_DAY_2020); QBENCHMARK { for (const QDateTime &test : list) @@ -544,7 +524,7 @@ void tst_QDateTime::fromMSecsSinceEpoch() const int end = JULIAN_DAY_2020 - JULIAN_DAY_1970; QBENCHMARK { for (int jd = start; jd < end; ++jd) - QDateTime::fromMSecsSinceEpoch(jd * MSECS_PER_DAY, Qt::LocalTime); + QDateTime::fromMSecsSinceEpoch(jd * MSECS_PER_DAY); } } @@ -554,10 +534,10 @@ void tst_QDateTime::fromMSecsSinceEpochUtc() const int end = JULIAN_DAY_2020 - JULIAN_DAY_1970; QBENCHMARK { for (int jd = start; jd < end; ++jd) - QDateTime::fromMSecsSinceEpoch(jd * MSECS_PER_DAY, Qt::UTC); + QDateTime::fromMSecsSinceEpoch(jd * MSECS_PER_DAY, QTimeZone::UTC); } } - +#if QT_CONFIG(timezone) void tst_QDateTime::fromMSecsSinceEpochTz() { const int start = JULIAN_DAY_2010 - JULIAN_DAY_1970; @@ -568,7 +548,8 @@ void tst_QDateTime::fromMSecsSinceEpochTz() QDateTime test = QDateTime::fromMSecsSinceEpoch(jd * MSECS_PER_DAY, cet); } } +#endif QTEST_MAIN(tst_QDateTime) -#include "main.moc" +#include "tst_bench_qdatetime.moc" diff --git a/tests/benchmarks/corelib/time/qtimezone/CMakeLists.txt b/tests/benchmarks/corelib/time/qtimezone/CMakeLists.txt index c6487499af..f80b64be2d 100644 --- a/tests/benchmarks/corelib/time/qtimezone/CMakeLists.txt +++ b/tests/benchmarks/corelib/time/qtimezone/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qtimezone.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qtimezone Binary: @@ -6,7 +7,7 @@ qt_internal_add_benchmark(tst_bench_qtimezone SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qtimezone.cpp + LIBRARIES Qt::Test ) diff --git a/tests/benchmarks/corelib/time/qtimezone/main.cpp b/tests/benchmarks/corelib/time/qtimezone/tst_bench_qtimezone.cpp index 509d62d3bb..db8b910d98 100644 --- a/tests/benchmarks/corelib/time/qtimezone/main.cpp +++ b/tests/benchmarks/corelib/time/qtimezone/tst_bench_qtimezone.cpp @@ -1,31 +1,7 @@ -/**************************************************************************** -** -** Copyright (C) 2019 Crimson AS <info@crimson.no> -** Copyright (C) 2018 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com> -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2022 The Qt Company Ltd. +// Copyright (C) 2019 Crimson AS <info@crimson.no> +// Copyright (C) 2018 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com> +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QTimeZone> #include <QTest> @@ -39,6 +15,7 @@ class tst_QTimeZone : public QObject Q_OBJECT private Q_SLOTS: +#if QT_CONFIG(timezone) void isTimeZoneIdAvailable(); void systemTimeZone(); void zoneByName_data(); @@ -49,31 +26,35 @@ private Q_SLOTS: void transitionsForward(); void transitionsReverse_data() { transitionList_data(); } void transitionsReverse(); +#endif }; static QList<QByteArray> enoughZones() { #ifdef EXHAUSTIVE - auto available = QTimeZone::availableTimeZoneIds(); - QList<QByteArray> result; - result.reserve(available.size() + 1); - for (conat auto &name : available) - result << name; + QList<QByteArray> result = QTimeZone::availableTimeZoneIds(); #else - QList<QByteArray> result { QByteArray("UTC"), - // Those named overtly in tst_QDateTime: - QByteArray("Europe/Oslo"), QByteArray("America/Vancouver"), - QByteArray("Europe/Berlin"), QByteArray("America/Sao_Paulo"), - QByteArray("Pacific/Auckland"), QByteArray("Australia/Eucla"), - QByteArray("Asia/Kathmandu"), QByteArray("Pacific/Kiritimati"), - QByteArray("Pacific/Apia"), QByteArray("UTC+12:00"), - QByteArray("Australia/Sydney"), QByteArray("Asia/Singapore"), - QByteArray("Australia/Brisbane") }; + QList<QByteArray> result { + QByteArray("UTC"), + // Those named overtly in tst_QDateTime - special cases first: + QByteArray("UTC-02:00"), QByteArray("UTC+02:00"), QByteArray("UTC+12:00"), + QByteArray("Etc/GMT+3"), QByteArray("GMT-2"), QByteArray("GMT"), + // ... then ordinary names in alphabetic order: + QByteArray("America/New_York"), QByteArray("America/Sao_Paulo"), + QByteArray("America/Vancouver"), + QByteArray("Asia/Kathmandu"), QByteArray("Asia/Singapore"), + QByteArray("Australia/Brisbane"), QByteArray("Australia/Eucla"), + QByteArray("Australia/Sydney"), + QByteArray("Europe/Berlin"), QByteArray("Europe/Helsinki"), + QByteArray("Europe/Rome"), QByteArray("Europe/Oslo"), + QByteArray("Pacific/Apia"), QByteArray("Pacific/Auckland"), + QByteArray("Pacific/Kiritimati") + }; #endif result << QByteArray("Vulcan/ShiKahr"); // invalid: also worth testing return result; } - +#if QT_CONFIG(timezone) void tst_QTimeZone::isTimeZoneIdAvailable() { const QList<QByteArray> available = QTimeZone::availableTimeZoneIds(); @@ -89,7 +70,6 @@ void tst_QTimeZone::systemTimeZone() QTimeZone::systemTimeZone(); } } - void tst_QTimeZone::zoneByName_data() { QTest::addColumn<QByteArray>("name"); @@ -126,9 +106,9 @@ void tst_QTimeZone::transitionList() { QFETCH(QByteArray, name); const QTimeZone zone = name.isEmpty() ? QTimeZone::systemTimeZone() : QTimeZone(name); - const QDateTime early = QDate(1625, 6, 8).startOfDay(Qt::UTC); // Cassini's birth date + const QDateTime early = QDate(1625, 6, 8).startOfDay(QTimeZone::UTC); // Cassini's birth date const QDateTime late // End of 32-bit signed time_t - = QDateTime::fromSecsSinceEpoch(std::numeric_limits<qint32>::max(), Qt::UTC); + = QDateTime::fromSecsSinceEpoch(std::numeric_limits<qint32>::max(), QTimeZone::UTC); QTimeZone::OffsetDataList seq; QBENCHMARK { seq = zone.transitions(early, late); @@ -140,7 +120,7 @@ void tst_QTimeZone::transitionsForward() { QFETCH(QByteArray, name); const QTimeZone zone = name.isEmpty() ? QTimeZone::systemTimeZone() : QTimeZone(name); - const QDateTime early = QDate(1625, 6, 8).startOfDay(Qt::UTC); // Cassini's birth date + const QDateTime early = QDate(1625, 6, 8).startOfDay(QTimeZone::UTC); // Cassini's birth date QBENCHMARK { QTimeZone::OffsetData tran = zone.nextTransition(early); while (tran.atUtc.isValid()) @@ -153,14 +133,15 @@ void tst_QTimeZone::transitionsReverse() QFETCH(QByteArray, name); const QTimeZone zone = name.isEmpty() ? QTimeZone::systemTimeZone() : QTimeZone(name); const QDateTime late // End of 32-bit signed time_t - = QDateTime::fromSecsSinceEpoch(std::numeric_limits<qint32>::max(), Qt::UTC); + = QDateTime::fromSecsSinceEpoch(std::numeric_limits<qint32>::max(), QTimeZone::UTC); QBENCHMARK { QTimeZone::OffsetData tran = zone.previousTransition(late); while (tran.atUtc.isValid()) tran = zone.previousTransition(tran.atUtc); } } +#endif QTEST_MAIN(tst_QTimeZone) -#include "main.moc" +#include "tst_bench_qtimezone.moc" diff --git a/tests/benchmarks/corelib/tools/CMakeLists.txt b/tests/benchmarks/corelib/tools/CMakeLists.txt index c1b5cad1aa..b46eac4165 100644 --- a/tests/benchmarks/corelib/tools/CMakeLists.txt +++ b/tests/benchmarks/corelib/tools/CMakeLists.txt @@ -1,12 +1,16 @@ -# Generated from tools.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause add_subdirectory(containers-associative) add_subdirectory(containers-sequential) add_subdirectory(qcontiguouscache) add_subdirectory(qcryptographichash) +add_subdirectory(qhash) add_subdirectory(qlist) add_subdirectory(qmap) add_subdirectory(qrect) add_subdirectory(qringbuffer) +add_subdirectory(qset) +add_subdirectory(qsharedpointer) add_subdirectory(qstack) add_subdirectory(qvector) diff --git a/tests/benchmarks/corelib/tools/containers-associative/CMakeLists.txt b/tests/benchmarks/corelib/tools/containers-associative/CMakeLists.txt index 1e653fa98d..7036fa96b7 100644 --- a/tests/benchmarks/corelib/tools/containers-associative/CMakeLists.txt +++ b/tests/benchmarks/corelib/tools/containers-associative/CMakeLists.txt @@ -1,15 +1,13 @@ -# Generated from containers-associative.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### -## tst_bench_containers-associative Binary: +## tst_bench_containers_associative Binary: ##################################################################### -qt_internal_add_benchmark(tst_bench_containers-associative +qt_internal_add_benchmark(tst_bench_containers_associative SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_containers_associative.cpp + LIBRARIES Qt::Test ) - -#### Keys ignored in scope 1:.:.:containers-associative.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/tools/containers-associative/main.cpp b/tests/benchmarks/corelib/tools/containers-associative/tst_bench_containers_associative.cpp index 555d4bf843..a5618cfcaf 100644 --- a/tests/benchmarks/corelib/tools/containers-associative/main.cpp +++ b/tests/benchmarks/corelib/tools/containers-associative/tst_bench_containers_associative.cpp @@ -1,31 +1,8 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QString> +#include <QMap> +#include <QHash> #include <qtest.h> @@ -127,4 +104,5 @@ void tst_associative_containers::lookup() } QTEST_MAIN(tst_associative_containers) -#include "main.moc" + +#include "tst_bench_containers_associative.moc" diff --git a/tests/benchmarks/corelib/tools/containers-sequential/CMakeLists.txt b/tests/benchmarks/corelib/tools/containers-sequential/CMakeLists.txt index f8ebc69c29..d24f26e664 100644 --- a/tests/benchmarks/corelib/tools/containers-sequential/CMakeLists.txt +++ b/tests/benchmarks/corelib/tools/containers-sequential/CMakeLists.txt @@ -1,15 +1,13 @@ -# Generated from containers-sequential.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_containers-sequential Binary: ##################################################################### -qt_internal_add_benchmark(tst_bench_containers-sequential +qt_internal_add_benchmark(tst_bench_containers_sequential SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_containers_sequential.cpp + LIBRARIES Qt::Test ) - -#### Keys ignored in scope 1:.:.:containers-sequential.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/tools/containers-sequential/main.cpp b/tests/benchmarks/corelib/tools/containers-sequential/tst_bench_containers_sequential.cpp index 1bb1a02a24..78c8016664 100644 --- a/tests/benchmarks/corelib/tools/containers-sequential/main.cpp +++ b/tests/benchmarks/corelib/tools/containers-sequential/tst_bench_containers_sequential.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only // This file contains benchmarks for comparing QList against std::vector #include <QtCore> @@ -90,7 +65,7 @@ class UseCases_stdvector : public UseCases<T> void insert(int size) override { std::vector<T> v; - T t; + T t = {}; QBENCHMARK { for (int i = 0; i < size; ++i) v.push_back(t); @@ -101,7 +76,7 @@ class UseCases_stdvector : public UseCases<T> { std::vector<T> v; - T t; + T t = {}; for (int i = 0; i < size; ++i) v.push_back(t); @@ -244,4 +219,5 @@ void tst_vector_vs_std::lookup_Large() } QTEST_MAIN(tst_vector_vs_std) -#include "main.moc" + +#include "tst_bench_containers_sequential.moc" diff --git a/tests/benchmarks/corelib/tools/qcontiguouscache/CMakeLists.txt b/tests/benchmarks/corelib/tools/qcontiguouscache/CMakeLists.txt index e683d60de2..9a68212fc0 100644 --- a/tests/benchmarks/corelib/tools/qcontiguouscache/CMakeLists.txt +++ b/tests/benchmarks/corelib/tools/qcontiguouscache/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qcontiguouscache.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qcontiguouscache Binary: @@ -6,7 +7,7 @@ qt_internal_add_benchmark(tst_bench_qcontiguouscache SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qcontiguouscache.cpp + LIBRARIES Qt::Test ) diff --git a/tests/benchmarks/corelib/tools/qcontiguouscache/main.cpp b/tests/benchmarks/corelib/tools/qcontiguouscache/tst_bench_qcontiguouscache.cpp index 368c8b66bb..ae2cf471b0 100644 --- a/tests/benchmarks/corelib/tools/qcontiguouscache/main.cpp +++ b/tests/benchmarks/corelib/tools/qcontiguouscache/tst_bench_qcontiguouscache.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QObject> #include <QTest> @@ -46,8 +21,6 @@ private slots: void contiguousCacheBenchmark(); }; -QTEST_MAIN(tst_QContiguousCache) - void tst_QContiguousCache::asScrollingList() { int i; @@ -176,4 +149,6 @@ void tst_QContiguousCache::contiguousCacheBenchmark() } } -#include "main.moc" +QTEST_MAIN(tst_QContiguousCache) + +#include "tst_bench_qcontiguouscache.moc" diff --git a/tests/benchmarks/corelib/tools/qcryptographichash/CMakeLists.txt b/tests/benchmarks/corelib/tools/qcryptographichash/CMakeLists.txt index 2ca8e683e1..b69b884f7d 100644 --- a/tests/benchmarks/corelib/tools/qcryptographichash/CMakeLists.txt +++ b/tests/benchmarks/corelib/tools/qcryptographichash/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qcryptographichash.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qcryptographichash Binary: @@ -6,7 +7,7 @@ qt_internal_add_benchmark(tst_bench_qcryptographichash SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qcryptographichash.cpp + LIBRARIES Qt::Test ) diff --git a/tests/benchmarks/corelib/tools/qcryptographichash/main.cpp b/tests/benchmarks/corelib/tools/qcryptographichash/main.cpp deleted file mode 100644 index 1f0a7373bb..0000000000 --- a/tests/benchmarks/corelib/tools/qcryptographichash/main.cpp +++ /dev/null @@ -1,188 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2017 Intel Corporation. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QByteArray> -#include <QCryptographicHash> -#include <QFile> -#include <QRandomGenerator> -#include <QString> -#include <QTest> - -#include <time.h> - -class tst_bench_QCryptographicHash : public QObject -{ - Q_OBJECT - QByteArray blockOfData; - -public: - tst_bench_QCryptographicHash(); - -private Q_SLOTS: - void hash_data(); - void hash(); - void addData_data() { hash_data(); } - void addData(); - void addDataChunked_data() { hash_data(); } - void addDataChunked(); -}; - -const int MaxCryptoAlgorithm = QCryptographicHash::Sha3_512; -const int MaxBlockSize = 65536; - -const char *algoname(int i) -{ - switch (QCryptographicHash::Algorithm(i)) { - case QCryptographicHash::Md4: - return "md4-"; - case QCryptographicHash::Md5: - return "md5-"; - case QCryptographicHash::Sha1: - return "sha1-"; - case QCryptographicHash::Sha224: - return "sha2_224-"; - case QCryptographicHash::Sha256: - return "sha2_256-"; - case QCryptographicHash::Sha384: - return "sha2_384-"; - case QCryptographicHash::Sha512: - return "sha2_512-"; - case QCryptographicHash::Sha3_224: - return "sha3_224-"; - case QCryptographicHash::Sha3_256: - return "sha3_256-"; - case QCryptographicHash::Sha3_384: - return "sha3_384-"; - case QCryptographicHash::Sha3_512: - return "sha3_512-"; - case QCryptographicHash::Keccak_224: - return "keccak_224-"; - case QCryptographicHash::Keccak_256: - return "keccak_256-"; - case QCryptographicHash::Keccak_384: - return "keccak_384-"; - case QCryptographicHash::Keccak_512: - return "keccak_512-"; - case QCryptographicHash::Blake2b_160: - return "blake2b_160-"; - case QCryptographicHash::Blake2b_256: - return "blake2b_256-"; - case QCryptographicHash::Blake2b_384: - return "blake2b_384-"; - case QCryptographicHash::Blake2b_512: - return "blake2b_512-"; - case QCryptographicHash::Blake2s_128: - return "blake2s_128-"; - case QCryptographicHash::Blake2s_160: - return "blake2s_160-"; - case QCryptographicHash::Blake2s_224: - return "blake2s_224-"; - case QCryptographicHash::Blake2s_256: - return "blake2s_256-"; - } - Q_UNREACHABLE(); - return nullptr; -} - -tst_bench_QCryptographicHash::tst_bench_QCryptographicHash() - : blockOfData(MaxBlockSize, Qt::Uninitialized) -{ -#ifdef Q_OS_UNIX - QFile urandom("/dev/urandom"); - if (urandom.open(QIODevice::ReadOnly | QIODevice::Unbuffered)) { - QCOMPARE(urandom.read(blockOfData.data(), blockOfData.size()), qint64(MaxBlockSize)); - } else -#endif - { - for (int i = 0; i < MaxBlockSize; ++i) - blockOfData[i] = QRandomGenerator::global()->generate(); - } -} - -void tst_bench_QCryptographicHash::hash_data() -{ - QTest::addColumn<int>("algorithm"); - QTest::addColumn<QByteArray>("data"); - - static const int datasizes[] = { 0, 1, 64, 65, 512, 4095, 4096, 4097, 65536 }; - for (uint i = 0; i < sizeof(datasizes)/sizeof(datasizes[0]); ++i) { - Q_ASSERT(datasizes[i] < MaxBlockSize); - QByteArray data = QByteArray::fromRawData(blockOfData.constData(), datasizes[i]); - - for (int algo = QCryptographicHash::Md4; algo <= MaxCryptoAlgorithm; ++algo) - QTest::newRow(algoname(algo) + QByteArray::number(datasizes[i])) << algo << data; - } -} - -void tst_bench_QCryptographicHash::hash() -{ - QFETCH(int, algorithm); - QFETCH(QByteArray, data); - - QCryptographicHash::Algorithm algo = QCryptographicHash::Algorithm(algorithm); - QBENCHMARK { - QCryptographicHash::hash(data, algo); - } -} - -void tst_bench_QCryptographicHash::addData() -{ - QFETCH(int, algorithm); - QFETCH(QByteArray, data); - - QCryptographicHash::Algorithm algo = QCryptographicHash::Algorithm(algorithm); - QCryptographicHash hash(algo); - QBENCHMARK { - hash.reset(); - hash.addData(data); - hash.result(); - } -} - -void tst_bench_QCryptographicHash::addDataChunked() -{ - QFETCH(int, algorithm); - QFETCH(QByteArray, data); - - QCryptographicHash::Algorithm algo = QCryptographicHash::Algorithm(algorithm); - QCryptographicHash hash(algo); - QBENCHMARK { - hash.reset(); - - // add the data in chunks of 64 bytes - for (int i = 0; i < data.size() / 64; ++i) - hash.addData(data.constData() + 64 * i, 64); - hash.addData(data.constData() + data.size() / 64 * 64, data.size() % 64); - - hash.result(); - } -} - -QTEST_APPLESS_MAIN(tst_bench_QCryptographicHash) - -#include "main.moc" diff --git a/tests/benchmarks/corelib/tools/qcryptographichash/tst_bench_qcryptographichash.cpp b/tests/benchmarks/corelib/tools/qcryptographichash/tst_bench_qcryptographichash.cpp new file mode 100644 index 0000000000..9f2d1c57f2 --- /dev/null +++ b/tests/benchmarks/corelib/tools/qcryptographichash/tst_bench_qcryptographichash.cpp @@ -0,0 +1,223 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// Copyright (C) 2017 Intel Corporation. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QByteArray> +#include <QCryptographicHash> +#include <QFile> +#include <QMetaEnum> +#include <QMessageAuthenticationCode> +#include <QRandomGenerator> +#include <QString> +#include <QTest> + +#include <qxpfunctional.h> +#include <numeric> + +#include <time.h> + +class tst_QCryptographicHash : public QObject +{ + Q_OBJECT + QByteArray blockOfData; + + using Algorithm = QCryptographicHash::Algorithm; + +public: + tst_QCryptographicHash(); + +private Q_SLOTS: + void hash_data(); + void hash(); + void addData_data() { hash_data(); } + void addData(); + void addDataChunked_data() { hash_data(); } + void addDataChunked(); + + // QMessageAuthenticationCode: + void hmac_hash_data() { hash_data(); } + void hmac_hash(); + void hmac_addData_data() { hash_data(); } + void hmac_addData(); + void hmac_setKey_data(); + void hmac_setKey(); +}; + +const int MaxBlockSize = 65536; + +static void for_each_algorithm(qxp::function_ref<void(QCryptographicHash::Algorithm, const char*) const> f) +{ + using A = QCryptographicHash::Algorithm; + static const auto metaEnum = QMetaEnum::fromType<A>(); + for (int i = 0, value = metaEnum.value(i); value != -1; value = metaEnum.value(++i)) + f(A(value), metaEnum.key(i)); +} + +tst_QCryptographicHash::tst_QCryptographicHash() + : blockOfData(MaxBlockSize, Qt::Uninitialized) +{ +#ifdef Q_OS_UNIX + QFile urandom("/dev/urandom"); + if (urandom.open(QIODevice::ReadOnly | QIODevice::Unbuffered)) { + QCOMPARE(urandom.read(blockOfData.data(), blockOfData.size()), qint64(MaxBlockSize)); + } else +#endif + { + for (int i = 0; i < MaxBlockSize; ++i) + blockOfData[i] = QRandomGenerator::global()->generate(); + } +} + +void tst_QCryptographicHash::hash_data() +{ + QTest::addColumn<Algorithm>("algo"); + QTest::addColumn<QByteArray>("data"); + + static const int datasizes[] = { 0, 1, 64, 65, 512, 4095, 4096, 4097, 65536 }; + for (uint i = 0; i < sizeof(datasizes)/sizeof(datasizes[0]); ++i) { + Q_ASSERT(datasizes[i] < MaxBlockSize); + QByteArray data = QByteArray::fromRawData(blockOfData.constData(), datasizes[i]); + + for_each_algorithm([&] (Algorithm algo, const char *name) { + if (algo == Algorithm::NumAlgorithms) + return; + QTest::addRow("%s-%d", name, datasizes[i]) << algo << data; + }); + } +} + +#define SKIP_IF_NOT_SUPPORTED(algo) do { \ + if (!QCryptographicHash::supportsAlgorithm(algo)) \ + QSKIP("This algorithm is not supported in this configuration"); \ + } while (false) \ + /* end */ + +void tst_QCryptographicHash::hash() +{ + QFETCH(const Algorithm, algo); + QFETCH(QByteArray, data); + + SKIP_IF_NOT_SUPPORTED(algo); + + QBENCHMARK { + [[maybe_unused]] + auto r = QCryptographicHash::hash(data, algo); + } +} + +void tst_QCryptographicHash::addData() +{ + QFETCH(const Algorithm, algo); + QFETCH(QByteArray, data); + + SKIP_IF_NOT_SUPPORTED(algo); + + QCryptographicHash hash(algo); + QBENCHMARK { + hash.reset(); + hash.addData(data); + [[maybe_unused]] + auto r = hash.resultView(); + } +} + +void tst_QCryptographicHash::addDataChunked() +{ + QFETCH(const Algorithm, algo); + QFETCH(QByteArray, data); + + SKIP_IF_NOT_SUPPORTED(algo); + + QCryptographicHash hash(algo); + QBENCHMARK { + hash.reset(); + + // add the data in chunks of 64 bytes + for (int i = 0; i < data.size() / 64; ++i) + hash.addData({data.constData() + 64 * i, 64}); + hash.addData({data.constData() + data.size() / 64 * 64, data.size() % 64}); + + [[maybe_unused]] + auto r = hash.resultView(); + } +} + +static QByteArray hmacKey() { + static QByteArray key = [] { + QByteArray result(277, Qt::Uninitialized); + std::iota(result.begin(), result.end(), uchar(0)); // uchar so wraps after UCHAR_MAX + return result; + }(); + return key; +} + +void tst_QCryptographicHash::hmac_hash() +{ + QFETCH(const Algorithm, algo); + QFETCH(const QByteArray, data); + + SKIP_IF_NOT_SUPPORTED(algo); + + const auto key = hmacKey(); + QBENCHMARK { + [[maybe_unused]] + auto r = QMessageAuthenticationCode::hash(data, key, algo); + } +} + +void tst_QCryptographicHash::hmac_addData() +{ + QFETCH(const Algorithm, algo); + QFETCH(const QByteArray, data); + + SKIP_IF_NOT_SUPPORTED(algo); + + const auto key = hmacKey(); + QMessageAuthenticationCode mac(algo, key); + QBENCHMARK { + mac.reset(); + mac.addData(data); + [[maybe_unused]] + auto r = mac.resultView(); + } +} + +void tst_QCryptographicHash::hmac_setKey_data() +{ + QTest::addColumn<Algorithm>("algo"); + for_each_algorithm([] (Algorithm algo, const char *name) { + if (algo == Algorithm::NumAlgorithms) + return; + QTest::addRow("%s", name) << algo; + }); +} + +void tst_QCryptographicHash::hmac_setKey() +{ + QFETCH(const Algorithm, algo); + + SKIP_IF_NOT_SUPPORTED(algo); + + const QByteArrayList keys = [] { + QByteArrayList result; + const auto fullKey = hmacKey(); + result.reserve(fullKey.size()); + for (auto i = fullKey.size(); i > 0; --i) + result.push_back(fullKey.sliced(i)); + return result; + }(); + + QMessageAuthenticationCode mac(algo); + QBENCHMARK { + for (const auto &key : keys) { + mac.setKey(key); + mac.addData("abc", 3); // avoid lazy setKey() + } + } +} + +#undef SKIP_IF_NOT_SUPPORTED + +QTEST_APPLESS_MAIN(tst_QCryptographicHash) + +#include "tst_bench_qcryptographichash.moc" diff --git a/tests/benchmarks/corelib/tools/qhash/CMakeLists.txt b/tests/benchmarks/corelib/tools/qhash/CMakeLists.txt index 5286484b0c..9002cc0723 100644 --- a/tests/benchmarks/corelib/tools/qhash/CMakeLists.txt +++ b/tests/benchmarks/corelib/tools/qhash/CMakeLists.txt @@ -1,15 +1,18 @@ -# Generated from qhash.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### -## tst_hash Binary: +## tst_bench_qhash Binary: ##################################################################### -qt_internal_add_benchmark(tst_hash +qt_internal_add_benchmark(tst_bench_qhash SOURCES - main.cpp + tst_bench_qhash.cpp outofline.cpp + NO_PCH_SOURCES + tst_bench_qhash.cpp # undef QT_NO_FOREACH INCLUDE_DIRECTORIES . - PUBLIC_LIBRARIES + LIBRARIES Qt::Test ) diff --git a/tests/benchmarks/corelib/tools/qhash/main.h b/tests/benchmarks/corelib/tools/qhash/main.h deleted file mode 100644 index eca4b61d58..0000000000 --- a/tests/benchmarks/corelib/tools/qhash/main.h +++ /dev/null @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtTest module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QString> - -struct Qt4String : QString -{ - Qt4String() {} - Qt4String(const QString &s) : QString(s) {} -}; - -QT_BEGIN_NAMESPACE -uint qHash(const Qt4String &); -QT_END_NAMESPACE - -struct Qt50String : QString -{ - Qt50String() {} - Qt50String(const QString &s) : QString(s) {} -}; - -QT_BEGIN_NAMESPACE -uint qHash(const Qt50String &, uint seed = 0); -QT_END_NAMESPACE - - -struct JavaString : QString -{ - JavaString() {} - JavaString(const QString &s) : QString(s) {} -}; - -QT_BEGIN_NAMESPACE -uint qHash(const JavaString &); -QT_END_NAMESPACE - diff --git a/tests/benchmarks/corelib/tools/qhash/outofline.cpp b/tests/benchmarks/corelib/tools/qhash/outofline.cpp index 4e449e76b4..5b16c36ffb 100644 --- a/tests/benchmarks/corelib/tools/qhash/outofline.cpp +++ b/tests/benchmarks/corelib/tools/qhash/outofline.cpp @@ -1,38 +1,13 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtTest module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only -#include "main.h" +#include "tst_bench_qhash.h" QT_BEGIN_NAMESPACE -uint qHash(const Qt4String &str) +size_t qHash(const Qt4String &str, size_t /* never used */) { - int n = str.length(); + qsizetype n = str.size(); const QChar *p = str.unicode(); uint h = 0; @@ -44,11 +19,11 @@ uint qHash(const Qt4String &str) return h; } -uint qHash(const Qt50String &key, uint seed) +size_t qHash(const Qt50String &key, size_t seed) { const QChar *p = key.unicode(); - int len = key.size(); - uint h = seed; + qsizetype len = key.size(); + size_t h = seed; for (int i = 0; i < len; ++i) h = 31 * h + p[i].unicode(); return h; @@ -65,10 +40,10 @@ uint qHash(const Qt50String &key, uint seed) // Still, we can avoid writing the multiplication as "(h << 5) - h" // -- the compiler will turn it into a shift and an addition anyway // (for instance, gcc 4.4 does that even at -O0). -uint qHash(const JavaString &str) +size_t qHash(const JavaString &str, size_t /* never used */) { - const unsigned short *p = (unsigned short *)str.constData(); - const int len = str.size(); + const auto *p = reinterpret_cast<const char16_t *>(str.constData()); + const qsizetype len = str.size(); uint h = 0; diff --git a/tests/benchmarks/corelib/tools/qhash/main.cpp b/tests/benchmarks/corelib/tools/qhash/tst_bench_qhash.cpp index f9b1624fcc..1a62a48437 100644 --- a/tests/benchmarks/corelib/tools/qhash/main.cpp +++ b/tests/benchmarks/corelib/tools/qhash/tst_bench_qhash.cpp @@ -1,33 +1,10 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Copyright (C) 2016 Intel Corporation. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "main.h" +// Copyright (C) 2016 The Qt Company Ltd. +// Copyright (C) 2016 Intel Corporation. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#undef QT_NO_FOREACH // this file contains unported legacy Q_FOREACH uses + +#include "tst_bench_qhash.h" #include <QFile> #include <QHash> @@ -36,6 +13,8 @@ #include <QUuid> #include <QTest> +static constexpr quint64 RandomSeed32 = 1045982819; +static constexpr quint64 RandomSeed64 = QtPrivate::QHashCombine{}(RandomSeed32, RandomSeed32); class tst_QHash : public QObject { @@ -54,6 +33,8 @@ private slots: void hashing_current_data() { data(); } void hashing_current() { hashing_template<QString>(); } + void hashing_qbytearray_data() { data(); } + void hashing_qbytearray() { hashing_template<QByteArray>(); } void hashing_qt50_data() { data(); } void hashing_qt50() { hashing_template<Qt50String>(); } void hashing_qt4_data() { data(); } @@ -61,15 +42,25 @@ private slots: void hashing_javaString_data() { data(); } void hashing_javaString() { hashing_template<JavaString>(); } + void hashing_nonzero_current_data() { data(); } + void hashing_nonzero_current() { hashing_nonzero_template<QString>(); } + void hashing_nonzero_qbytearray_data() { data(); } + void hashing_nonzero_qbytearray() { hashing_nonzero_template<QByteArray>(); } + void hashing_nonzero_qlatin1string_data() { data(); } + void hashing_nonzero_qlatin1string() { hashing_nonzero_template<OwningLatin1String>(); } + private: void data(); template <typename String> void qhash_template(); - template <typename String> void hashing_template(); + template <typename String, size_t Seed = 0> void hashing_template(); + template <typename String> void hashing_nonzero_template() + { hashing_template<String, size_t(RandomSeed64)>(); } QStringList smallFilePaths; QStringList uuids; QStringList dict; QStringList numbers; + QStringList longstrings; }; ///////////////////// QHash ///////////////////// @@ -78,7 +69,10 @@ private: void tst_QHash::initTestCase() { - // small list of file paths + QHashSeed::setDeterministicGlobalSeed(); + + // small list of strings (that happen to look like file paths produced long + // ago by cd ../.. && find . -print, but that's irrelevant). QFile smallPathsData(QFINDTESTDATA("paths_small_data.txt")); QVERIFY(smallPathsData.open(QIODevice::ReadOnly)); smallFilePaths = QString::fromLatin1(smallPathsData.readAll()).split(QLatin1Char('\n')); @@ -88,15 +82,17 @@ void tst_QHash::initTestCase() // guaranteed to be completely random, generated by http://xkcd.com/221/ QUuid ns = QUuid("{f43d2ef3-2fe9-4563-a6f5-5a0100c2d699}"); uuids.reserve(smallFilePaths.size()); + longstrings.reserve(smallFilePaths.size()); foreach (const QString &path, smallFilePaths) uuids.append(QUuid::createUuidV5(ns, path).toString()); - + for (qsizetype i = 0; i < uuids.size(); ++i) + longstrings.append(uuids.at(i).repeated(8)); // lots of strings with alphabetical characters, vaguely reminiscent of // a dictionary. // - // this programatically generates a series like: + // this programmatically generates a series like: // AAAAAA // AAAAAB // AAAAAC @@ -109,7 +105,7 @@ void tst_QHash::initTestCase() QByteArray id("AAAAAAA"); if (dict.isEmpty()) { - for (int i = id.length() - 1; i > 0;) { + for (int i = id.size() - 1; i > 0;) { dict.append(id); char c = id.at(i); id[i] = ++c; @@ -132,6 +128,7 @@ void tst_QHash::data() QTest::addColumn<QStringList>("items"); QTest::newRow("paths-small") << smallFilePaths; QTest::newRow("uuids-list") << uuids; + QTest::newRow("longstrings-list") << longstrings; QTest::newRow("dictionary") << dict; QTest::newRow("numbers") << numbers; } @@ -152,22 +149,33 @@ template <typename String> void tst_QHash::qhash_template() } } -template <typename String> void tst_QHash::hashing_template() +template <typename String, size_t Seed> void tst_QHash::hashing_template() { // just the hashing function QFETCH(QStringList, items); QList<String> realitems; realitems.reserve(items.size()); - foreach (const QString &s, items) - realitems.append(s); + foreach (const QString &s, items) { + if constexpr (std::is_same_v<QString::value_type, typename String::value_type>) { + realitems.append(s); + } else if constexpr (sizeof(typename String::value_type) == 1) { + realitems.append(String(s.toLatin1())); + } + } QBENCHMARK { - for (int i = 0, n = realitems.size(); i != n; ++i) - (void)qHash(realitems.at(i)); + for (int i = 0, n = realitems.size(); i != n; ++i) { + volatile size_t h = qHash(realitems.at(i), Seed); + (void)h; +#ifdef Q_CC_GNU + // "use" h + asm ("" : "+r" (h)); +#endif + } } } QTEST_MAIN(tst_QHash) -#include "main.moc" +#include "tst_bench_qhash.moc" diff --git a/tests/benchmarks/corelib/tools/qhash/tst_bench_qhash.h b/tests/benchmarks/corelib/tools/qhash/tst_bench_qhash.h new file mode 100644 index 0000000000..501b4a8b7f --- /dev/null +++ b/tests/benchmarks/corelib/tools/qhash/tst_bench_qhash.h @@ -0,0 +1,48 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QHashFunctions> +#include <QString> + +struct OwningLatin1String : QByteArray +{ + OwningLatin1String() = default; + OwningLatin1String(const QByteArray &a) : QByteArray(a) {} + OwningLatin1String(QByteArray &&a) : QByteArray(std::move(a)) {} +}; +QT_BEGIN_NAMESPACE +inline size_t qHash(const OwningLatin1String &s, size_t seed = 0) +{ return qHash(QLatin1StringView(s), seed); } +QT_END_NAMESPACE + +struct Qt4String : QString +{ + Qt4String() {} + Qt4String(const QString &s) : QString(s) {} +}; + +QT_BEGIN_NAMESPACE +size_t qHash(const Qt4String &, size_t = 0); +QT_END_NAMESPACE + +struct Qt50String : QString +{ + Qt50String() {} + Qt50String(const QString &s) : QString(s) {} +}; + +QT_BEGIN_NAMESPACE +size_t qHash(const Qt50String &, size_t seed = 0); +QT_END_NAMESPACE + + +struct JavaString : QString +{ + JavaString() {} + JavaString(const QString &s) : QString(s) {} +}; + +QT_BEGIN_NAMESPACE +size_t qHash(const JavaString &, size_t = 0); +QT_END_NAMESPACE + diff --git a/tests/benchmarks/corelib/tools/qlist/CMakeLists.txt b/tests/benchmarks/corelib/tools/qlist/CMakeLists.txt index 46ca1c8514..dabfe08122 100644 --- a/tests/benchmarks/corelib/tools/qlist/CMakeLists.txt +++ b/tests/benchmarks/corelib/tools/qlist/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qlist.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qlist Binary: @@ -6,7 +7,7 @@ qt_internal_add_benchmark(tst_bench_qlist SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qlist.cpp + LIBRARIES Qt::Test ) diff --git a/tests/benchmarks/corelib/tools/qlist/main.cpp b/tests/benchmarks/corelib/tools/qlist/tst_bench_qlist.cpp index 47e7d8a4a6..24691d1f71 100644 --- a/tests/benchmarks/corelib/tools/qlist/main.cpp +++ b/tests/benchmarks/corelib/tools/qlist/tst_bench_qlist.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2020 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QList> #include <QTest> @@ -35,86 +10,42 @@ static const int N = 1000; struct MyBase { - MyBase(int i_) - : isCopy(false) - { - ++liveCount; - - i = i_; - } + MyBase(int i_) : i(i_) { } - MyBase(const MyBase &other) - : isCopy(true) - { - if (isCopy) - ++copyCount; - ++liveCount; - - i = other.i; - } + MyBase(const MyBase &other) : i(other.i) { } MyBase &operator=(const MyBase &other) { - if (!isCopy) { - isCopy = true; - ++copyCount; - } else { - ++errorCount; - } - i = other.i; return *this; } - ~MyBase() - { - if (isCopy) { - if (!copyCount) - ++errorCount; - else - --copyCount; - } - if (!liveCount) - ++errorCount; - else - --liveCount; - } - bool operator==(const MyBase &other) const { return i == other.i; } protected: - ushort i; - bool isCopy; - -public: - static int errorCount; - static int liveCount; - static int copyCount; + int i; }; -int MyBase::errorCount = 0; -int MyBase::liveCount = 0; -int MyBase::copyCount = 0; - struct MyPrimitive : public MyBase { - MyPrimitive(int i = -1) : MyBase(i) - { ++errorCount; } - MyPrimitive(const MyPrimitive &other) : MyBase(other) - { ++errorCount; } - ~MyPrimitive() - { ++errorCount; } + MyPrimitive(int i_ = -1) : MyBase(i_) { } + MyPrimitive(const MyPrimitive &other) : MyBase(other) { } + MyPrimitive &operator=(const MyPrimitive &other) + { + MyBase::operator=(other); + return *this; + } }; struct MyMovable : public MyBase { - MyMovable(int i = -1) : MyBase(i) {} + MyMovable(int i_ = -1) : MyBase(i_) {} }; struct MyComplex : public MyBase { - MyComplex(int i = -1) : MyBase(i) {} + MyComplex(int i_ = -1) : MyBase(i_) {} }; QT_BEGIN_NAMESPACE @@ -130,13 +61,14 @@ class tst_QList: public QObject { Q_OBJECT + const int million = 1000000; private Q_SLOTS: void removeAll_primitive_data(); - void removeAll_primitive(); - void removeAll_movable_data(); - void removeAll_movable(); - void removeAll_complex_data(); - void removeAll_complex(); + void removeAll_primitive() { removeAll_impl<MyPrimitive>(); } + void removeAll_movable_data() { removeAll_primitive_data(); } + void removeAll_movable() { removeAll_impl<MyMovable>(); } + void removeAll_complex_data() { removeAll_primitive_data(); } + void removeAll_complex() { removeAll_impl<MyComplex>(); } // append 1 element: void appendOne_int_data() const { commonBenchmark_data<int>(); } @@ -164,12 +96,12 @@ private Q_SLOTS: void prependOne_complex() const { prependOne_impl<QList, MyComplex>(); } void prependOne_QString() const { prependOne_impl<QList, QString>(); } - // insert in middle 1 element: - void midInsertOne_int_data() const { commonBenchmark_data<int>(); } - void midInsertOne_primitive_data() const { commonBenchmark_data<MyPrimitive>(); } - void midInsertOne_movable_data() const { commonBenchmark_data<MyMovable>(); } - void midInsertOne_complex_data() const { commonBenchmark_data<MyComplex>(); } - void midInsertOne_QString_data() const { commonBenchmark_data<QString>(); } + // insert in middle 1 element (quadratic, slow): + void midInsertOne_int_data() const { commonBenchmark_data<int>(million); } + void midInsertOne_primitive_data() const { commonBenchmark_data<MyPrimitive>(million); } + void midInsertOne_movable_data() const { commonBenchmark_data<MyMovable>(million); } + void midInsertOne_complex_data() const { commonBenchmark_data<MyComplex>(million / 10); } + void midInsertOne_QString_data() const { commonBenchmark_data<QString>(million / 10); } void midInsertOne_int() const { midInsertOne_impl<QList, int>(); } void midInsertOne_primitive() const { midInsertOne_impl<QList, MyPrimitive>(); } @@ -206,12 +138,12 @@ private Q_SLOTS: void prependAppendHalvesOne_complex() const { prependAppendHalvesOne_impl<QList, MyComplex>(); } void prependAppendHalvesOne_QString() const { prependAppendHalvesOne_impl<QList, QString>(); } - // emplace in middle 1 element: - void midEmplaceOne_int_data() const { commonBenchmark_data<int>(); } - void midEmplaceOne_primitive_data() const { commonBenchmark_data<MyPrimitive>(); } - void midEmplaceOne_movable_data() const { commonBenchmark_data<MyMovable>(); } - void midEmplaceOne_complex_data() const { commonBenchmark_data<MyComplex>(); } - void midEmplaceOne_QString_data() const { commonBenchmark_data<QString>(); } + // emplace in middle 1 element (quadratic, slow): + void midEmplaceOne_int_data() const { commonBenchmark_data<int>(million); } + void midEmplaceOne_primitive_data() const { commonBenchmark_data<MyPrimitive>(million); } + void midEmplaceOne_movable_data() const { commonBenchmark_data<MyMovable>(million); } + void midEmplaceOne_complex_data() const { commonBenchmark_data<MyComplex>(million / 10); } + void midEmplaceOne_QString_data() const { commonBenchmark_data<QString>(million / 10); } void midEmplaceOne_int() const { midEmplaceOne_impl<QList, int>(); } void midEmplaceOne_primitive() const { midEmplaceOne_impl<QList, MyPrimitive>(); } @@ -246,8 +178,11 @@ private Q_SLOTS: void removeFirstSpecial_QString() const { removeFirstSpecial_impl<QList, QString>(); } private: + template <class T> + void removeAll_impl() const; + template<typename> - void commonBenchmark_data() const; + void commonBenchmark_data(int max = 200000000) const; template<template<typename> typename, typename> void appendOne_impl() const; @@ -275,101 +210,48 @@ private: }; template <class T> -void removeAll_test(const QList<int> &i10, ushort valueToRemove, int itemsToRemove) +void tst_QList::removeAll_impl() const { - bool isComplex = QTypeInfo<T>::isComplex; - - MyBase::errorCount = 0; - MyBase::liveCount = 0; - MyBase::copyCount = 0; - { - QList<T> list; - QCOMPARE(MyBase::liveCount, 0); - QCOMPARE(MyBase::copyCount, 0); + QFETCH(QList<int>, i10); + QFETCH(int, itemsToRemove); - for (int i = 0; i < 10 * N; ++i) { - T t(i10.at(i % 10)); - list.append(t); - } - QCOMPARE(MyBase::liveCount, isComplex ? list.size() : 0); - QCOMPARE(MyBase::copyCount, isComplex ? list.size() : 0); + constexpr int valueToRemove = 5; - T t(valueToRemove); - QCOMPARE(MyBase::liveCount, isComplex ? list.size() + 1 : 1); - QCOMPARE(MyBase::copyCount, isComplex ? list.size() : 0); + QList<T> list; + for (int i = 0; i < 10 * N; ++i) { + T t(i10.at(i % 10)); + list.append(t); + } - int removedCount = 0; // make compiler happy by setting to 0 - QList<T> l; + T t(valueToRemove); - QBENCHMARK { - l = list; - removedCount = l.removeAll(t); - } - QCOMPARE(removedCount, itemsToRemove * N); - QCOMPARE(l.size() + removedCount, list.size()); - QVERIFY(!l.contains(valueToRemove)); + qsizetype removedCount = 0; // make compiler happy by setting to 0 + QList<T> l; - QCOMPARE(MyBase::liveCount, isComplex ? l.isDetached() ? list.size() + l.size() + 1 : list.size() + 1 : 1); - QCOMPARE(MyBase::copyCount, isComplex ? l.isDetached() ? list.size() + l.size() : list.size() : 0); + QBENCHMARK { + l = list; + removedCount = l.removeAll(t); } - if (isComplex) - QCOMPARE(MyBase::errorCount, 0); + QCOMPARE(removedCount, itemsToRemove * N); + QCOMPARE(l.size() + removedCount, list.size()); + QVERIFY(!l.contains(valueToRemove)); } - void tst_QList::removeAll_primitive_data() { qRegisterMetaType<QList<int> >(); QTest::addColumn<QList<int> >("i10"); - QTest::addColumn<int>("valueToRemove"); QTest::addColumn<int>("itemsToRemove"); - QTest::newRow("0%") << (QList<int>() << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0) << 5 << 0; - QTest::newRow("10%") << (QList<int>() << 0 << 0 << 0 << 0 << 5 << 0 << 0 << 0 << 0 << 0) << 5 << 1; - QTest::newRow("90%") << (QList<int>() << 5 << 5 << 5 << 5 << 0 << 5 << 5 << 5 << 5 << 5) << 5 << 9; - QTest::newRow("100%") << (QList<int>() << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5) << 5 << 10; -} - -void tst_QList::removeAll_primitive() -{ - QFETCH(QList<int>, i10); - QFETCH(int, valueToRemove); - QFETCH(int, itemsToRemove); - - removeAll_test<MyPrimitive>(i10, valueToRemove, itemsToRemove); -} - -void tst_QList::removeAll_movable_data() -{ - removeAll_primitive_data(); -} - -void tst_QList::removeAll_movable() -{ - QFETCH(QList<int>, i10); - QFETCH(int, valueToRemove); - QFETCH(int, itemsToRemove); - - removeAll_test<MyMovable>(i10, valueToRemove, itemsToRemove); -} - -void tst_QList::removeAll_complex_data() -{ - removeAll_primitive_data(); -} - -void tst_QList::removeAll_complex() -{ - QFETCH(QList<int>, i10); - QFETCH(int, valueToRemove); - QFETCH(int, itemsToRemove); - - removeAll_test<MyComplex>(i10, valueToRemove, itemsToRemove); + QTest::newRow("0%") << QList<int>(10, 0) << 0; + QTest::newRow("10%") << (QList<int>() << 0 << 0 << 0 << 0 << 5 << 0 << 0 << 0 << 0 << 0) << 1; + QTest::newRow("90%") << (QList<int>() << 5 << 5 << 5 << 5 << 0 << 5 << 5 << 5 << 5 << 5) << 9; + QTest::newRow("100%") << QList<int>(10, 5) << 10; } template<typename T> -void tst_QList::commonBenchmark_data() const +void tst_QList::commonBenchmark_data(int max) const { QTest::addColumn<int>("elemCount"); @@ -380,7 +262,8 @@ void tst_QList::commonBenchmark_data() const // cap at 20m elements to allow 5.15/6.0 coverage to be the same for (auto pair : { p(100, "100"), p(1000, "1k"), p(10000, "10k"), p(100000, "100k"), p(1000000, "1m"), p(10000000, "10m"), p(20000000, "20m") }) { - addRow(pair.first, pair.second); + if (pair.first <= max) + addRow(pair.first, pair.second); } } @@ -524,4 +407,4 @@ void tst_QList::removeFirstSpecial_impl() const QTEST_APPLESS_MAIN(tst_QList) -#include "main.moc" +#include "tst_bench_qlist.moc" diff --git a/tests/benchmarks/corelib/tools/qmap/CMakeLists.txt b/tests/benchmarks/corelib/tools/qmap/CMakeLists.txt index 5937eda37c..4dc3dbb258 100644 --- a/tests/benchmarks/corelib/tools/qmap/CMakeLists.txt +++ b/tests/benchmarks/corelib/tools/qmap/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qmap.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qmap Binary: @@ -6,9 +7,9 @@ qt_internal_add_benchmark(tst_bench_qmap SOURCES - main.cpp + tst_bench_qmap.cpp INCLUDE_DIRECTORIES . - PUBLIC_LIBRARIES + LIBRARIES Qt::Test ) diff --git a/tests/benchmarks/corelib/tools/qmap/main.cpp b/tests/benchmarks/corelib/tools/qmap/tst_bench_qmap.cpp index 50cc853df6..db3c4fc7a2 100644 --- a/tests/benchmarks/corelib/tools/qmap/main.cpp +++ b/tests/benchmarks/corelib/tools/qmap/tst_bench_qmap.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QFile> #include <QMap> @@ -61,16 +36,41 @@ private slots: void insertion_string_int2_hint(); void insertMap(); + +private: + QStringList helloEachWorld(int count); }; +QStringList tst_QMap::helloEachWorld(int count) +{ + QStringList result; + result.reserve(count); + result << QStringLiteral("Hello World"); // at index 0, not used + + char16_t name[] = u"Hello World"; + QStringView str(name); + for (int i = 1; i < count; ++i) { + auto p = name + 6; // In the gap between words. + for (const auto ch : QChar::fromUcs4(i)) + p++[0] = ch; + result << str.toString(); + } + return result; +} + +constexpr int huge = 100000; // one hundred thousand; simple integral data tests +// Sum of i with 0 <= i < huge; overflows, but that's OK as long as it's unsigned: +constexpr uint hugeSum = (uint(huge) / 2) * uint(huge - 1); +constexpr int bigish = 5000; // five thousand; tests using XString's expensive < void tst_QMap::insertion_int_int() { QMap<int, int> map; QBENCHMARK { - for (int i = 0; i < 100000; ++i) + for (int i = 0; i < huge; ++i) map.insert(i, i); } + QCOMPARE(map.size(), qsizetype(huge)); } void tst_QMap::insertion_int_intx() @@ -79,36 +79,40 @@ void tst_QMap::insertion_int_intx() // The results in the beginning of the test seems to be a somewhat inaccurate. QMap<int, int> map; QBENCHMARK { - for (int i = 0; i < 100000; ++i) + for (int i = 0; i < huge; ++i) map.insert(i, i); } + QCOMPARE(map.size(), qsizetype(huge)); } void tst_QMap::insertion_int_int_with_hint1() { QMap<int, int> map; QBENCHMARK { - for (int i = 0; i < 100000; ++i) + for (int i = 0; i < huge; ++i) map.insert(map.constEnd(), i, i); } + QCOMPARE(map.size(), qsizetype(huge)); } void tst_QMap::insertion_int_int2() { QMap<int, int> map; QBENCHMARK { - for (int i = 100000; i >= 0; --i) + for (int i = huge; i >= 0; --i) map.insert(i, i); } + QCOMPARE(map.size(), qsizetype(huge) + 1); } void tst_QMap::insertion_int_int_with_hint2() { QMap<int, int> map; QBENCHMARK { - for (int i = 100000; i >= 0; --i) + for (int i = huge; i >= 0; --i) map.insert(map.constBegin(), i, i); } + QCOMPARE(map.size(), qsizetype(huge) + 1); } void tst_QMap::insertion_int_string() @@ -116,93 +120,100 @@ void tst_QMap::insertion_int_string() QMap<int, QString> map; QString str("Hello World"); QBENCHMARK { - for (int i = 0; i < 100000; ++i) + for (int i = 0; i < huge; ++i) map.insert(i, str); } + QCOMPARE(map.size(), qsizetype(huge)); } void tst_QMap::insertion_string_int() { QMap<QString, int> map; - QString str("Hello World"); + const QStringList names = helloEachWorld(huge); + QCOMPARE(names.size(), qsizetype(huge)); QBENCHMARK { - for (int i = 1; i < 100000; ++i) { - str[0] = QChar(i); - map.insert(str, i); - } + for (int i = 1; i < huge; ++i) + map.insert(names.at(i), i); } + QCOMPARE(map.size() + 1, qsizetype(huge)); } - void tst_QMap::lookup_int_int() { QMap<int, int> map; - for (int i = 0; i < 100000; ++i) + for (int i = 0; i < huge; ++i) map.insert(i, i); + QCOMPARE(map.size(), qsizetype(huge)); - int sum = 0; + uint sum = 0, count = 0; QBENCHMARK { - for (int i = 0; i < 100000; ++i) + for (int i = 0; i < huge; ++i) sum += map.value(i); + ++count; } + QCOMPARE(sum, hugeSum * count); } void tst_QMap::lookup_int_string() { QMap<int, QString> map; QString str("Hello World"); - for (int i = 0; i < 100000; ++i) + for (int i = 0; i < huge; ++i) map.insert(i, str); + QCOMPARE(map.size(), qsizetype(huge)); QBENCHMARK { - for (int i = 0; i < 100000; ++i) - str += map.value(i); + for (int i = 0; i < huge; ++i) + str = map.value(i); } } void tst_QMap::lookup_string_int() { QMap<QString, int> map; - QString str("Hello World"); - for (int i = 1; i < 100000; ++i) { - str[0] = QChar(i); - map.insert(str, i); - } + const QStringList names = helloEachWorld(huge); + for (int i = 1; i < huge; ++i) + map.insert(names.at(i), i); + QCOMPARE(map.size() + 1, qsizetype(huge)); - int sum = 0; + uint sum = 0, count = 0; QBENCHMARK { - for (int i = 1; i < 100000; ++i) { - str[0] = QChar(i); - sum += map.value(str); - } + for (int i = 1; i < huge; ++i) + sum += map.value(names.at(i)); + ++count; } + QCOMPARE(sum, hugeSum * count); } // iteration speed doesn't depend on the type of the map. void tst_QMap::iteration() { QMap<int, int> map; - for (int i = 0; i < 100000; ++i) + for (int i = 0; i < huge; ++i) map.insert(i, i); + QCOMPARE(map.size(), qsizetype(huge)); - int j = 0; + uint sum = 0, count = 0; QBENCHMARK { for (int i = 0; i < 100; ++i) { QMap<int, int>::const_iterator it = map.constBegin(); QMap<int, int>::const_iterator end = map.constEnd(); while (it != end) { - j += *it; + sum += *it; ++it; } } + ++count; } + QCOMPARE(sum, hugeSum * 100u * count); } void tst_QMap::toStdMap() { QMap<int, int> map; - for (int i = 0; i < 100000; ++i) + for (int i = 0; i < huge; ++i) map.insert(i, i); + QCOMPARE(map.size(), qsizetype(huge)); QBENCHMARK { std::map<int, int> n = map.toStdMap(); @@ -213,11 +224,12 @@ void tst_QMap::toStdMap() void tst_QMap::iterator_begin() { QMap<int, int> map; - for (int i = 0; i < 100000; ++i) + for (int i = 0; i < huge; ++i) map.insert(i, i); + QCOMPARE(map.size(), qsizetype(huge)); QBENCHMARK { - for (int i = 0; i < 100000; ++i) { + for (int i = 0; i < huge; ++i) { QMap<int, int>::const_iterator it = map.constBegin(); QMap<int, int>::const_iterator end = map.constEnd(); if (it == end) // same as if (false) @@ -229,8 +241,9 @@ void tst_QMap::iterator_begin() void tst_QMap::ctorStdMap() { std::map<int, int> map; - for (int i = 0; i < 100000; ++i) + for (int i = 0; i < huge; ++i) map.insert(std::pair<int, int>(i, i)); + QCOMPARE(map.size(), size_t(huge)); QBENCHMARK { QMap<int, int> qmap(map); @@ -251,33 +264,35 @@ void tst_QMap::insertion_string_int2() { QMap<XString, int> map; QBENCHMARK { - for (int i = 1; i < 5000; ++i) { + for (int i = 1; i < bigish; ++i) { XString str; str.setNum(i); map.insert(str, i); } } + QCOMPARE(map.size() + 1, qsizetype(bigish)); } void tst_QMap::insertion_string_int2_hint() { QMap<XString, int> map; QBENCHMARK { - for (int i = 1; i < 5000; ++i) { + for (int i = 1; i < bigish; ++i) { XString str; str.setNum(i); map.insert(map.end(), str, i); } } + QCOMPARE(map.size() + 1, qsizetype(bigish)); } void tst_QMap::insertMap() { QMap<int, int> map; - for (int i = 0; i < 100000; ++i) + for (int i = 0; i < huge; ++i) map.insert(i * 4, 0); QMap<int, int> map2; - for (int i = 0; i < 50000; ++i) + for (int i = 0; i < huge / 2; ++i) map2.insert(i * 7, 0); QBENCHMARK_ONCE { map.insert(map2); @@ -286,4 +301,4 @@ void tst_QMap::insertMap() QTEST_MAIN(tst_QMap) -#include "main.moc" +#include "tst_bench_qmap.moc" diff --git a/tests/benchmarks/corelib/tools/qrect/CMakeLists.txt b/tests/benchmarks/corelib/tools/qrect/CMakeLists.txt index 30234c7055..e28ca82c74 100644 --- a/tests/benchmarks/corelib/tools/qrect/CMakeLists.txt +++ b/tests/benchmarks/corelib/tools/qrect/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qrect.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qrect Binary: @@ -6,10 +7,7 @@ qt_internal_add_benchmark(tst_bench_qrect SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qrect.cpp + LIBRARIES Qt::Test ) - -#### Keys ignored in scope 1:.:.:qrect.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/tools/qrect/main.cpp b/tests/benchmarks/corelib/tools/qrect/tst_bench_qrect.cpp index 7ddf17845c..0ba9e15963 100644 --- a/tests/benchmarks/corelib/tools/qrect/main.cpp +++ b/tests/benchmarks/corelib/tools/qrect/tst_bench_qrect.cpp @@ -1,36 +1,13 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only // This file contains benchmarks for QRect/QRectF functions. +#undef QT_NO_FOREACH // this file contains unported legacy Q_FOREACH uses + #include <QDebug> #include <qtest.h> -class tst_qrect : public QObject +class tst_QRect : public QObject { Q_OBJECT private slots: @@ -159,12 +136,12 @@ static void addRectPointData(bool includeProperArg = false) } } -void tst_qrect::contains_point_data() +void tst_QRect::contains_point_data() { addRectPointData(true); } -void tst_qrect::contains_point() +void tst_QRect::contains_point() { QFETCH(QRectF, rf); QFETCH(QPointF, pf); @@ -176,12 +153,12 @@ void tst_qrect::contains_point() } } -void tst_qrect::contains_rect_data() +void tst_QRect::contains_rect_data() { addRectRectData(true); } -void tst_qrect::contains_rect() +void tst_QRect::contains_rect() { QFETCH(QRectF, rf1); QFETCH(QRectF, rf2); @@ -193,12 +170,12 @@ void tst_qrect::contains_rect() } } -void tst_qrect::intersects_data() +void tst_QRect::intersects_data() { addRectRectData(); } -void tst_qrect::intersects() +void tst_QRect::intersects() { QFETCH(QRectF, rf1); QFETCH(QRectF, rf2); @@ -209,12 +186,12 @@ void tst_qrect::intersects() } } -void tst_qrect::intersected_data() +void tst_QRect::intersected_data() { addRectRectData(); } -void tst_qrect::intersected() +void tst_QRect::intersected() { QFETCH(QRectF, rf1); QFETCH(QRectF, rf2); @@ -225,12 +202,12 @@ void tst_qrect::intersected() } } -void tst_qrect::united_data() +void tst_QRect::united_data() { addRectRectData(); } -void tst_qrect::united() +void tst_QRect::united() { QFETCH(QRectF, rf1); QFETCH(QRectF, rf2); @@ -241,12 +218,12 @@ void tst_qrect::united() } } -void tst_qrect::contains_point_f_data() +void tst_QRect::contains_point_f_data() { addRectPointData(); } -void tst_qrect::contains_point_f() +void tst_QRect::contains_point_f() { QFETCH(QRectF, rf); QFETCH(QPointF, pf); @@ -255,12 +232,12 @@ void tst_qrect::contains_point_f() } } -void tst_qrect::contains_rect_f_data() +void tst_QRect::contains_rect_f_data() { addRectRectData(); } -void tst_qrect::contains_rect_f() +void tst_QRect::contains_rect_f() { QFETCH(QRectF, rf1); QFETCH(QRectF, rf2); @@ -269,12 +246,12 @@ void tst_qrect::contains_rect_f() } } -void tst_qrect::intersects_f_data() +void tst_QRect::intersects_f_data() { addRectRectData(); } -void tst_qrect::intersects_f() +void tst_QRect::intersects_f() { QFETCH(QRectF, rf1); QFETCH(QRectF, rf2); @@ -283,12 +260,12 @@ void tst_qrect::intersects_f() } } -void tst_qrect::intersected_f_data() +void tst_QRect::intersected_f_data() { addRectRectData(); } -void tst_qrect::intersected_f() +void tst_QRect::intersected_f() { QFETCH(QRectF, rf1); QFETCH(QRectF, rf2); @@ -297,12 +274,12 @@ void tst_qrect::intersected_f() } } -void tst_qrect::united_f_data() +void tst_QRect::united_f_data() { addRectRectData(); } -void tst_qrect::united_f() +void tst_QRect::united_f() { QFETCH(QRectF, rf1); QFETCH(QRectF, rf2); @@ -311,6 +288,6 @@ void tst_qrect::united_f() } } -QTEST_MAIN(tst_qrect) +QTEST_MAIN(tst_QRect) -#include "main.moc" +#include "tst_bench_qrect.moc" diff --git a/tests/benchmarks/corelib/tools/qringbuffer/CMakeLists.txt b/tests/benchmarks/corelib/tools/qringbuffer/CMakeLists.txt index 63128f5f95..322fbbb83c 100644 --- a/tests/benchmarks/corelib/tools/qringbuffer/CMakeLists.txt +++ b/tests/benchmarks/corelib/tools/qringbuffer/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from qringbuffer.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_bench_qringbuffer Binary: @@ -6,11 +7,8 @@ qt_internal_add_benchmark(tst_bench_qringbuffer SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qringbuffer.cpp + LIBRARIES Qt::CorePrivate Qt::Test ) - -#### Keys ignored in scope 1:.:.:qringbuffer.pro:<TRUE>: -# TEMPLATE = "app" diff --git a/tests/benchmarks/corelib/tools/qringbuffer/main.cpp b/tests/benchmarks/corelib/tools/qringbuffer/main.cpp deleted file mode 100644 index fad30a4e34..0000000000 --- a/tests/benchmarks/corelib/tools/qringbuffer/main.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <private/qringbuffer_p.h> -#include <QByteArray> - -#include <qtest.h> - -class tst_qringbuffer : public QObject -{ - Q_OBJECT -private slots: - void reserveAndRead(); - void free(); -}; - -void tst_qringbuffer::reserveAndRead() -{ - QRingBuffer ringBuffer; - QBENCHMARK { - for (qint64 i = 1; i < 256; ++i) - ringBuffer.reserve(i); - - for (qint64 i = 1; i < 256; ++i) - ringBuffer.read(0, i); - } -} - -void tst_qringbuffer::free() -{ - QRingBuffer ringBuffer; - QBENCHMARK { - ringBuffer.reserve(4096); - ringBuffer.reserve(2048); - ringBuffer.append(QByteArray("01234", 5)); - - ringBuffer.free(1); - ringBuffer.free(4096); - ringBuffer.free(48); - ringBuffer.free(2000); - } -} - -QTEST_MAIN(tst_qringbuffer) - -#include "main.moc" diff --git a/tests/benchmarks/corelib/tools/qringbuffer/tst_bench_qringbuffer.cpp b/tests/benchmarks/corelib/tools/qringbuffer/tst_bench_qringbuffer.cpp new file mode 100644 index 0000000000..f352cd56a9 --- /dev/null +++ b/tests/benchmarks/corelib/tools/qringbuffer/tst_bench_qringbuffer.cpp @@ -0,0 +1,46 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <private/qringbuffer_p.h> +#include <QByteArray> + +#include <qtest.h> + +class tst_QRingBuffer : public QObject +{ + Q_OBJECT +private slots: + void reserveAndRead(); + void free(); +}; + +void tst_QRingBuffer::reserveAndRead() +{ + QRingBuffer ringBuffer; + QBENCHMARK { + for (qint64 i = 1; i < 256; ++i) + ringBuffer.reserve(i); + + for (qint64 i = 1; i < 256; ++i) + ringBuffer.read(0, i); + } +} + +void tst_QRingBuffer::free() +{ + QRingBuffer ringBuffer; + QBENCHMARK { + ringBuffer.reserve(4096); + ringBuffer.reserve(2048); + ringBuffer.append(QByteArray("01234", 5)); + + ringBuffer.free(1); + ringBuffer.free(4096); + ringBuffer.free(48); + ringBuffer.free(2000); + } +} + +QTEST_MAIN(tst_QRingBuffer) + +#include "tst_bench_qringbuffer.moc" diff --git a/tests/benchmarks/corelib/tools/qset/CMakeLists.txt b/tests/benchmarks/corelib/tools/qset/CMakeLists.txt index 00fd088776..7bbed20106 100644 --- a/tests/benchmarks/corelib/tools/qset/CMakeLists.txt +++ b/tests/benchmarks/corelib/tools/qset/CMakeLists.txt @@ -1,12 +1,13 @@ -# Generated from qset.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### -## tst_qset Binary: +## tst_bench_qset Binary: ##################################################################### -qt_internal_add_benchmark(tst_qset +qt_internal_add_benchmark(tst_bench_qset SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qset.cpp + LIBRARIES Qt::Test ) diff --git a/tests/benchmarks/corelib/tools/qset/main.cpp b/tests/benchmarks/corelib/tools/qset/tst_bench_qset.cpp index f6c40ec160..5bbec05aab 100644 --- a/tests/benchmarks/corelib/tools/qset/main.cpp +++ b/tests/benchmarks/corelib/tools/qset/tst_bench_qset.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QSet> #include <QTest> @@ -34,12 +9,22 @@ class tst_QSet : public QObject Q_OBJECT private slots: + void initTestCase(); void intersect_int_data(); void intersect_int(); void intersect_complexType_data(); void intersect_complexType(); + void unite_int_data(); + void unite_int(); + void contains_then_insert_int_data(); + void contains_then_insert_int(); }; +void tst_QSet::initTestCase() +{ + QHashSeed::setDeterministicGlobalSeed(); +} + void tst_QSet::intersect_int_data() { QTest::addColumn<int>("lhsSize"); @@ -123,6 +108,70 @@ void tst_QSet::intersect_complexType() } } +void tst_QSet::unite_int_data() +{ + QTest::addColumn<int>("lhsSize"); + QTest::addColumn<int>("rhsSize"); + QTest::addColumn<int>("overlap"); + + QTest::newRow("1000000.unite(1000) - 0 overlap") << 1000000 << 1000 << 0; + QTest::newRow("1000000.unite(1000) - 100 overlap") << 1000000 << 1000 << 100; + QTest::newRow("1000000.unite(1000) - 1000 overlap") << 1000000 << 1000 << 1000; + QTest::newRow("1000.unite(1000000) - 0 overlap") << 1000 << 1000000 << 0; + QTest::newRow("1000.unite(1000000) - 100 overlap") << 1000 << 1000000 << 100; + QTest::newRow("1000.unite(1000000) - 1000 overlap") << 1000 << 1000000 << 1000; +} + +auto build_sets(int lhsSize, int rhsSize, int overlap) +{ + QSet<int> lhs; + for (int i = 0; i < lhsSize; ++i) + lhs.insert(i); + + QSet<int> rhs; + for (int i = lhsSize - overlap; i < rhsSize + lhsSize - overlap; ++i) + rhs.insert(i); + + return std::make_pair(lhs, rhs); +} + +void tst_QSet::unite_int() +{ + QFETCH(int, lhsSize); + QFETCH(int, rhsSize); + QFETCH(int, overlap); + + auto [lhs, rhs] = build_sets(lhsSize, rhsSize, overlap); + + QBENCHMARK { + QSet united = QSet(lhs).unite(rhs); + QCOMPARE(united.size(), lhsSize + rhsSize - overlap); + } +} + +void tst_QSet::contains_then_insert_int_data() +{ + unite_int_data(); +} + +void tst_QSet::contains_then_insert_int() +{ + QFETCH(int, lhsSize); + QFETCH(int, rhsSize); + QFETCH(int, overlap); + + auto [lhs, rhs] = build_sets(lhsSize, rhsSize, overlap); + + QBENCHMARK { + QSet copy(lhs); + for (auto i : rhs) { + if (!copy.contains(i)) + copy.insert(i); + } + QCOMPARE(copy.size(), lhsSize + rhsSize - overlap); + } +} + QTEST_MAIN(tst_QSet) -#include "main.moc" +#include "tst_bench_qset.moc" diff --git a/tests/benchmarks/corelib/tools/qsharedpointer/CMakeLists.txt b/tests/benchmarks/corelib/tools/qsharedpointer/CMakeLists.txt new file mode 100644 index 0000000000..6adf1f2e4e --- /dev/null +++ b/tests/benchmarks/corelib/tools/qsharedpointer/CMakeLists.txt @@ -0,0 +1,12 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +qt_internal_add_benchmark(tst_bench_shared_ptr + SOURCES + tst_bench_shared_ptr.cpp + INCLUDE_DIRECTORIES + . + LIBRARIES + Qt::Core + Qt::Test +) diff --git a/tests/benchmarks/corelib/tools/qsharedpointer/tst_bench_shared_ptr.cpp b/tests/benchmarks/corelib/tools/qsharedpointer/tst_bench_shared_ptr.cpp new file mode 100644 index 0000000000..6197863601 --- /dev/null +++ b/tests/benchmarks/corelib/tools/qsharedpointer/tst_bench_shared_ptr.cpp @@ -0,0 +1,111 @@ +// Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com> +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QObject> +#include <QScopeGuard> +#include <QSharedPointer> +#include <QTest> + +#include <atomic> +#include <memory> +#include <thread> +#include <vector> + +#if __has_include(<boost/shared_ptr.hpp>) +# include <boost/shared_ptr.hpp> +# include <boost/make_shared.hpp> + +# ifdef BOOST_NO_EXCEPTIONS +// https://stackoverflow.com/a/9530546/134841 +// https://www.boost.org/doc/libs/1_79_0/libs/throw_exception/doc/html/throw_exception.html#throw_exception +BOOST_NORETURN void boost::throw_exception(const std::exception &) { std::terminate(); } +# if BOOST_VERSION >= 107300 +// https://www.boost.org/doc/libs/1_79_0/libs/throw_exception/doc/html/throw_exception.html#changes_in_1_73_0 +BOOST_NORETURN void boost::throw_exception(const std::exception &, const boost::source_location &) +{ std::terminate(); } +# endif // Boost v1.73 +# endif // BOOST_NO_EXCEPTIONS + +# define ONLY_IF_BOOST(x) x +#else +# define ONLY_IF_BOOST(x) QSKIP("This benchmark requires Boost.SharedPtr.") +#endif + +class tst_QSharedPointer : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + void refAndDeref_null_QSP_int() { refAndDeref<QSharedPointer<int>>(); } + void refAndDeref_null_SSP_int() { refAndDeref<std::shared_ptr<int>>(); } + void refAndDeref_null_BSP_int() { ONLY_IF_BOOST(refAndDeref<boost::shared_ptr<int>>()); } + + void refAndDeref_null_QSP_QString() { refAndDeref<QSharedPointer<QString>>(); } + void refAndDeref_null_SSP_QString() { refAndDeref<std::shared_ptr<QString>>(); } + void refAndDeref_null_BSP_QString() { ONLY_IF_BOOST(refAndDeref<boost::shared_ptr<QString>>()); } + + void refAndDeref_nonnull_QSP_int() { refAndDeref(QSharedPointer<int>::create(42)); } + void refAndDeref_nonnull_SSP_int() { refAndDeref(std::make_shared<int>(42)); } + void refAndDeref_nonnull_BSP_int() { ONLY_IF_BOOST(refAndDeref(boost::make_shared<int>(42))); } + + void refAndDeref_nonnull_QSP_QString() { refAndDeref(QSharedPointer<QString>::create(QStringLiteral("Hello"))); } + void refAndDeref_nonnull_SSP_QString() { refAndDeref(std::make_shared<QString>(QStringLiteral("Hello"))); } + void refAndDeref_nonnull_BSP_QString() { ONLY_IF_BOOST(refAndDeref(boost::make_shared<QString>(QStringLiteral("Hello")))); } + +private: + template <typename SP> + void refAndDeref(SP sp = {}) + { + QBENCHMARK { + [[maybe_unused]] auto copy = sp; + } + } + +private Q_SLOTS: + void threadedRefAndDeref_null_QSP_int() { threadedRefAndDeref<QSharedPointer<int>>(); } + void threadedRefAndDeref_null_SSP_int() { threadedRefAndDeref<std::shared_ptr<int>>(); } + void threadedRefAndDeref_null_BSP_int() { ONLY_IF_BOOST(threadedRefAndDeref<boost::shared_ptr<int>>()); } + + void threadedRefAndDeref_null_QSP_QString() { threadedRefAndDeref<QSharedPointer<QString>>(); } + void threadedRefAndDeref_null_SSP_QString() { threadedRefAndDeref<std::shared_ptr<QString>>(); } + void threadedRefAndDeref_null_BSP_QString() { ONLY_IF_BOOST(threadedRefAndDeref<boost::shared_ptr<QString>>()); } + + void threadedRefAndDeref_nonnull_QSP_int() { threadedRefAndDeref(QSharedPointer<int>::create(42)); } + void threadedRefAndDeref_nonnull_SSP_int() { threadedRefAndDeref(std::make_shared<int>(42)); } + void threadedRefAndDeref_nonnull_BSP_int() { ONLY_IF_BOOST(threadedRefAndDeref(boost::make_shared<int>(42))); } + + void threadedRefAndDeref_nonnull_QSP_QString() { threadedRefAndDeref(QSharedPointer<QString>::create(QStringLiteral("Hello"))); } + void threadedRefAndDeref_nonnull_SSP_QString() { threadedRefAndDeref(std::make_shared<QString>(QStringLiteral("Hello"))); } + void threadedRefAndDeref_nonnull_BSP_QString() { ONLY_IF_BOOST(threadedRefAndDeref(boost::make_shared<QString>(QStringLiteral("Hello")))); } + +private: + template <typename SP> + void threadedRefAndDeref(SP sp = {}) + { + std::atomic<bool> cancel = false; + std::vector<std::thread> threads; + const auto numCores = std::max(2U, std::thread::hardware_concurrency()); + for (uint i = 0; i < numCores - 1; ++i) { + threads.emplace_back([sp, &cancel] { + while (!cancel.load(std::memory_order_relaxed)) { + for (int i = 0; i < 100; ++i) + [[maybe_unused]] auto copy = sp; + } + }); + } + const auto join = qScopeGuard([&] { + cancel.store(true, std::memory_order_relaxed); + for (auto &t : threads) + t.join(); + }); + + QBENCHMARK { + [[maybe_unused]] auto copy = sp; + } + } +}; + +QTEST_MAIN(tst_QSharedPointer) + +#include "tst_bench_shared_ptr.moc" diff --git a/tests/benchmarks/corelib/tools/qstack/CMakeLists.txt b/tests/benchmarks/corelib/tools/qstack/CMakeLists.txt index 4526af60db..e5ae510521 100644 --- a/tests/benchmarks/corelib/tools/qstack/CMakeLists.txt +++ b/tests/benchmarks/corelib/tools/qstack/CMakeLists.txt @@ -1,13 +1,14 @@ -# Generated from qstack.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### -## tst_bench_stack Binary: +## tst_bench_qstack Binary: ##################################################################### -qt_internal_add_benchmark(tst_bench_stack +qt_internal_add_benchmark(tst_bench_qstack SOURCES - main.cpp - PUBLIC_LIBRARIES + tst_bench_qstack.cpp + LIBRARIES Qt::CorePrivate Qt::Test ) diff --git a/tests/benchmarks/corelib/tools/qstack/main.cpp b/tests/benchmarks/corelib/tools/qstack/main.cpp deleted file mode 100644 index c69e5c3ed8..0000000000 --- a/tests/benchmarks/corelib/tools/qstack/main.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 Robin Burchell <robin.burchell@viroteck.net> -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QStack> -#include <QDebug> -#include <QTest> - -#include <vector> - -class tst_QStack: public QObject -{ - Q_OBJECT - -private slots: - void qstack_push(); - void qstack_pop(); - void qstack_pushpopone(); -}; - -const int N = 1000000; - -void tst_QStack::qstack_push() -{ - QStack<int> v; - QBENCHMARK { - for (int i = 0; i != N; ++i) - v.push(i); - v = QStack<int>(); - } -} - -void tst_QStack::qstack_pop() -{ - QStack<int> v; - for (int i = 0; i != N; ++i) - v.push(i); - - QBENCHMARK { - QStack<int> v2 = v; - for (int i = 0; i != N; ++i) { - v2.pop(); - } - } -} - -void tst_QStack::qstack_pushpopone() -{ - QBENCHMARK { - QStack<int> v; - for (int i = 0; i != N; ++i) { - v.push(0); - v.pop(); - } - } -} - -QTEST_MAIN(tst_QStack) - -#include "main.moc" diff --git a/tests/benchmarks/corelib/tools/qstack/tst_bench_qstack.cpp b/tests/benchmarks/corelib/tools/qstack/tst_bench_qstack.cpp new file mode 100644 index 0000000000..e0c8cda18c --- /dev/null +++ b/tests/benchmarks/corelib/tools/qstack/tst_bench_qstack.cpp @@ -0,0 +1,59 @@ +// Copyright (C) 2015 Robin Burchell <robin.burchell@viroteck.net> +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QStack> +#include <QDebug> +#include <QTest> + +#include <vector> + +class tst_QStack: public QObject +{ + Q_OBJECT + +private slots: + void qstack_push(); + void qstack_pop(); + void qstack_pushpopone(); +}; + +const int N = 1000000; + +void tst_QStack::qstack_push() +{ + QStack<int> v; + QBENCHMARK { + for (int i = 0; i != N; ++i) + v.push(i); + v = QStack<int>(); + } +} + +void tst_QStack::qstack_pop() +{ + QStack<int> v; + for (int i = 0; i != N; ++i) + v.push(i); + + QBENCHMARK { + QStack<int> v2 = v; + for (int i = 0; i != N; ++i) { + v2.pop(); + } + } +} + +void tst_QStack::qstack_pushpopone() +{ + QBENCHMARK { + QStack<int> v; + for (int i = 0; i != N; ++i) { + v.push(0); + v.pop(); + } + } +} + +QTEST_MAIN(tst_QStack) + +#include "tst_bench_qstack.moc" diff --git a/tests/benchmarks/corelib/tools/qvector/CMakeLists.txt b/tests/benchmarks/corelib/tools/qvector/CMakeLists.txt index 467405eea0..df2fc8ec6a 100644 --- a/tests/benchmarks/corelib/tools/qvector/CMakeLists.txt +++ b/tests/benchmarks/corelib/tools/qvector/CMakeLists.txt @@ -1,16 +1,17 @@ -# Generated from qvector.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### -## tst_bench_vector Binary: +## tst_bench_qvector Binary: ##################################################################### -qt_internal_add_benchmark(tst_bench_vector +qt_internal_add_benchmark(tst_bench_qvector SOURCES - main.cpp + tst_bench_qvector.cpp outofline.cpp INCLUDE_DIRECTORIES . - PUBLIC_LIBRARIES + LIBRARIES Qt::CorePrivate Qt::Test ) diff --git a/tests/benchmarks/corelib/tools/qvector/main.cpp b/tests/benchmarks/corelib/tools/qvector/main.cpp deleted file mode 100644 index b090c04480..0000000000 --- a/tests/benchmarks/corelib/tools/qvector/main.cpp +++ /dev/null @@ -1,414 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QVector> -#include <QDebug> -#include <QTest> - -#include "qrawvector.h" - -#include <vector> - -/* - -Code generated by g++ 4.3.3. The lines marked with '!' are the ones that get -executed inside the loop. Using the external 's' causes some load making the -loop resembling a 'simple inner loop' in 'real' applications. - - -qvector_mutable_read_access: - -.L166: -! movl -16(%ebp), %edx -! movl (%edx), %eax -! subl $1, %eax -! je .L165 - movl 4(%edx), %eax - movl %eax, 8(%esp) - movl 8(%edx), %eax - movl %esi, (%esp) - movl %eax, 4(%esp) - call _ZN4myns7QVectorIdE7reallocEii -.L165: -! movl -16(%ebp), %eax -! fldl s -! faddl 16(%eax,%ebx,8) -! addl $1, %ebx -! cmpl $10000, %ebx -! fstpl s -! jne .L166 - - -qvector_const_read_access: - - movl -16(%ebp), %edx - xorl %eax, %eax -.L183: -! fldl s -! faddl 16(%edx,%eax,8) -! addl $1, %eax -! cmpl $10000, %eax -! fstpl s -! jne .L183 - - -stdvector_const_read_access and stdvector_mutable_read_access and -qrawvector_const_read_access and qrawvector_mutable_read_access: - - xorl %eax, %eax -.L64: -! fldl s -! faddl (%ebx,%eax,8) -! addl $1, %eax -! cmpl $10000, %eax -! fstpl s -! jne .L64 - - - -Behaviour varies with small modifications, but total is more or -less stable: - -qrawvector_mutable_read_access, using size() instead of N: - -.L145: -! faddl (%edx,%eax,8) -! addl $1, %eax -! cmpl %ecx, %eax -! fstl s -! jne .L145 -! fstp %st(0) - - -qrawvector_mutable_read_access, counting backward: - -.L145: -! faddl (%edx,%eax,8) -! subl $1, %eax -! cmpl $-1, %eax -! fstl s -! jne .L145 - - -qrawvector_mutable_read_access, counting backward, using size(): - -.L146: -! faddl (%edx) -! addl $1, %eax -! subl $8, %edx -! cmpl %ecx, %eax -! fstl s -! jne .L146 - - - -*/ - - -/* - -//////////////////////////////////////////////////////////////////// - -time ./tst_vector qvector_const_read_access -real 0m12.912s -user 0m12.401s -sys 0m0.016s - -time ./tst_vector qvector_mutable_read_access -real 0m38.566s -user 0m36.754s -sys 0m0.008s - - -time ./tst_vector stdvector_mutable_read_access -real 0m12.736s -user 0m12.665s -sys 0m0.004s - - -//////////////////////////////////////////////////////////////////// - -time ./tst_vector qvector_fill_and_return -real 0m28.778s -user 0m28.522s -sys 0m0.012s - -time ./tst_vector stdvector_fill_and_return -real 0m26.675s -user 0m26.558s -sys 0m0.012s - -time ./tst_vector qrawvector_fill_and_return -real 0m23.370s -user 0m23.269s -sys 0m0.008s - - - -*/ - - - -#define TEST_RETURN 1 - -// For some reason, both 'plain' and '-callgrind' create strange results -// (like varying instruction count for the same assembly code) -// So replace it by a plain loop and measure wall clock time. -//#undef QBENCHMARK -//#define QBENCHMARK for (int j = 0; j != 10000; ++j) - -class tst_QVector: public QObject -{ - Q_OBJECT - -private slots: - void calibration(); - - // Pure Qt solution - void qvector_separator() { qWarning() << "QVector results: "; } - void qvector_const_read_access(); - void qvector_mutable_read_access(); - void qvector_pop_back(); - #ifdef TEST_RETURN - void qvector_fill_and_return(); - #endif - - // Purre Standard solution - void stdvector() { qWarning() << "std::vector results: "; } - void stdvector_const_read_access(); - void stdvector_mutable_read_access(); - void stdvector_pop_back(); - - #ifdef TEST_RETURN - void stdvector_fill_and_return(); - #endif - - // Build using std, pass as QVector - void mixedvector() { qWarning() << "mixed results: "; } - #ifdef TEST_RETURN - void mixedvector_fill_and_return(); - #endif - - // Alternative implementation - void qrawvector_separator() { qWarning() << "QRawVector results: "; } - void qrawvector_const_read_access(); - void qrawvector_mutable_read_access(); - #ifdef TEST_RETURN - void qrawvector_fill_and_return(); - #endif -}; - -const int N = 1000000; -extern double s; - -void tst_QVector::calibration() -{ - QVector<double> v(N); - for (int i = 0; i != N; ++i) - v[i] = i; - QBENCHMARK { - for (int i = 0; i != N; ++i) - s += i; - } -} - -///////////////////// QVector ///////////////////// - -void tst_QVector::qvector_const_read_access() -{ - QVector<double> v(N); - for (int i = 0; i != N; ++i) - v[i] = i; - - const QVector<double> &vc = v; - QBENCHMARK { - for (int i = 0; i != N; ++i) - s += vc[i]; - } -} - -void tst_QVector::qvector_mutable_read_access() -{ - QVector<double> v(N); - for (int i = 0; i != N; ++i) - v[i] = i; - - QBENCHMARK { - for (int i = 0; i != N; ++i) - s += v[i]; - } -} - -#ifdef TEST_RETURN -extern QVector<double> qvector_fill_and_return_helper(); - -void tst_QVector::qvector_fill_and_return() -{ - QBENCHMARK { - QVector<double> v = qvector_fill_and_return_helper(); - s += v[1]; - } -} - -#endif - - -///////////////////// QRawVector ///////////////////// - -void tst_QVector::qrawvector_const_read_access() -{ - QRawVector<double> v(N); - for (int i = 0; i != N; ++i) - v[i] = i; - - const QRawVector<double> &vc = v; - QBENCHMARK { - for (int i = vc.size(); --i >= 0;) - s += vc[i]; - } -} - -void tst_QVector::qrawvector_mutable_read_access() -{ - QRawVector<double> v(N); - for (int i = 0; i != N; ++i) - v[i] = i; - - QBENCHMARK { - for (int i = 0; i != N; ++i) - s += v[i]; - } -} - -void tst_QVector::qvector_pop_back() -{ - const int c1 = 100000; - QVERIFY(N % c1 == 0); - - QVector<int> v; - v.resize(N); - - QBENCHMARK { - for (int i = 0; i < c1; ++i) - v.pop_back(); - if (v.size() == 0) - v.resize(N); - } -} - - - -#ifdef TEST_RETURN -extern QVector<double> qrawvector_fill_and_return_helper(); - -void tst_QVector::qrawvector_fill_and_return() -{ - QBENCHMARK { - QVector<double> v = qrawvector_fill_and_return_helper(); - s += v[1]; - } -} - -#endif - - -///////////////////// std::vector ///////////////////// - -void tst_QVector::stdvector_const_read_access() -{ - std::vector<double> v(N); - for (int i = 0; i != N; ++i) - v[i] = i; - - const std::vector<double> &vc = v; - QBENCHMARK { - for (int i = 0; i != N; ++i) - s += vc[i]; - } -} - -void tst_QVector::stdvector_mutable_read_access() -{ - std::vector<double> v(N); - for (int i = 0; i != N; ++i) - v[i] = i; - - QBENCHMARK { - for (int i = 0; i != N; ++i) - s += v[i]; - } -} - -void tst_QVector::stdvector_pop_back() -{ - const int c1 = 100000; - QVERIFY(N % c1 == 0); - - std::vector<int> v; - v.resize(N); - - QBENCHMARK { - for (int i = 0; i < c1; ++i) - v.pop_back(); - if (v.size() == 0) - v.resize(N); - } -} - -#ifdef TEST_RETURN -extern std::vector<double> stdvector_fill_and_return_helper(); - -void tst_QVector::stdvector_fill_and_return() -{ - QBENCHMARK { - std::vector<double> v = stdvector_fill_and_return_helper(); - s += v[1]; - } -} - -#endif - -///////////////////// mixed vector ///////////////////// - - -#ifdef TEST_RETURN -extern QVector<double> mixedvector_fill_and_return_helper(); - -void tst_QVector::mixedvector_fill_and_return() -{ - QBENCHMARK { - std::vector<double> v = stdvector_fill_and_return_helper(); - s += v[1]; - } -} - -#endif - -QTEST_MAIN(tst_QVector) - -#include "main.moc" diff --git a/tests/benchmarks/corelib/tools/qvector/outofline.cpp b/tests/benchmarks/corelib/tools/qvector/outofline.cpp index daa630efe1..eb4756f710 100644 --- a/tests/benchmarks/corelib/tools/qvector/outofline.cpp +++ b/tests/benchmarks/corelib/tools/qvector/outofline.cpp @@ -1,58 +1,33 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtTest module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QList> -#include <vector> #include "qrawvector.h" +#include <vector> -const int N = 1000000; -double s = 0; +// Used as accumulator in tests: +double accumulate = 0; QVector<double> qvector_fill_and_return_helper() { - QVector<double> v(N); - for (int i = 0; i != N; ++i) + QVector<double> v(million); + for (int i = 0; i != million; ++i) v[i] = i; return v; } QVector<double> qrawvector_fill_and_return_helper() { - QRawVector<double> v(N); - for (int i = 0; i != N; ++i) + QRawVector<double> v(million); + for (int i = 0; i != million; ++i) v[i] = i; return v.mutateToVector(); } QVector<double> mixedvector_fill_and_return_helper() { - std::vector<double> v(N); - for (int i = 0; i != N; ++i) + std::vector<double> v(million); + for (int i = 0; i != million; ++i) v[i] = i; return QVector<double>(v.begin(), v.end()); } @@ -60,8 +35,8 @@ QVector<double> mixedvector_fill_and_return_helper() std::vector<double> stdvector_fill_and_return_helper() { - std::vector<double> v(N); - for (int i = 0; i != N; ++i) + std::vector<double> v(million); + for (int i = 0; i != million; ++i) v[i] = i; return v; } @@ -80,6 +55,8 @@ QVectorData *QVectorData::allocate(int size, int alignment) return static_cast<QVectorData *>(alignment > alignmentThreshold() ? qMallocAligned(size, alignment) : ::malloc(size)); } +QT_BEGIN_NAMESPACE + QVectorData *QVectorData::reallocate(QVectorData *x, int newsize, int oldsize, int alignment) { if (alignment > alignmentThreshold()) @@ -99,3 +76,5 @@ int QVectorData::grow(int sizeOfHeader, int size, int sizeOfT) { return qCalculateGrowingBlockSize(size, sizeOfT, sizeOfHeader).elementCount; } + +QT_END_NAMESPACE diff --git a/tests/benchmarks/corelib/tools/qvector/qrawvector.h b/tests/benchmarks/corelib/tools/qvector/qrawvector.h index 1f615f6e69..9e68b81285 100644 --- a/tests/benchmarks/corelib/tools/qvector/qrawvector.h +++ b/tests/benchmarks/corelib/tools/qvector/qrawvector.h @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #ifndef QRAWVECTOR_H #define QRAWVECTOR_H @@ -41,8 +16,16 @@ #include <stdlib.h> #include <string.h> -QT_BEGIN_NAMESPACE +const int million = 1000000; +extern double accumulate; + +// Defined in outofline.cpp +extern QVector<double> qvector_fill_and_return_helper(); +extern QVector<double> qrawvector_fill_and_return_helper(); +extern std::vector<double> stdvector_fill_and_return_helper(); +extern QVector<double> mixedvector_fill_and_return_helper(); +QT_BEGIN_NAMESPACE struct QVectorData { @@ -217,6 +200,7 @@ private: public: QVector<T> mutateToVector() { + Q_ASSERT(!"Fix QTBUG-95061 before calling this; it is broken beyond repair"); Data *d = toBase(m_begin); d->ref.initializeOwned(); d->alloc = m_alloc; diff --git a/tests/benchmarks/corelib/tools/qvector/tst_bench_qvector.cpp b/tests/benchmarks/corelib/tools/qvector/tst_bench_qvector.cpp new file mode 100644 index 0000000000..0486beed4e --- /dev/null +++ b/tests/benchmarks/corelib/tools/qvector/tst_bench_qvector.cpp @@ -0,0 +1,228 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QVector> +#include <QDebug> +#include <QTest> + +#include "qrawvector.h" + +#include <vector> + +/* Using 'extern accumulate' causes some load making the loop resembling a + 'simple inner loop' in 'real' applications. +*/ + +/* QRawVector::mutateToVector() hacks a semblance of a Qt 5 QVector. + + However, Qt 6's QVector is Qt 6's QList and completely different in internal + layout. The QTypedArrayData inside it is also completely rearranged. Until + QRawVector can be rewritten to do whatever it's supposed to do in a + Qt6-compatible way, this test is suppressed, see QTBUG-95061. +*/ +#define TEST_RAW 0 + +// TODO: is this still a thing ? (Dates from g++ 4.3.3 in 2009.) +// For some reason, both 'plain' and '-callgrind' create strange results +// (like varying instruction count for the same assembly code) +// So replace it by a plain loop and measure wall clock time. +//#undef QBENCHMARK +//#define QBENCHMARK for (int j = 0; j != 10000; ++j) + +class tst_QVector: public QObject +{ + Q_OBJECT + +private slots: + void calibration(); + + // Pure Qt solution + void qvector_separator() { qWarning() << "QVector results: "; } + void qvector_const_read_access(); + void qvector_mutable_read_access(); + void qvector_pop_back(); + void qvector_fill_and_return(); + + // Purre Standard solution + void stdvector() { qWarning() << "std::vector results: "; } + void stdvector_const_read_access(); + void stdvector_mutable_read_access(); + void stdvector_pop_back(); + void stdvector_fill_and_return(); + + // Build using std, pass as QVector + void mixedvector() { qWarning() << "mixed results: "; } + void mixedvector_fill_and_return(); + + // Alternative implementation + void qrawvector_separator() { qWarning() << "QRawVector results: "; } + void qrawvector_const_read_access(); + void qrawvector_mutable_read_access(); +#if TEST_RAW + void qrawvector_fill_and_return(); +#endif +}; + +void tst_QVector::calibration() +{ + QVector<double> v(million); + for (int i = 0; i < million; ++i) + v[i] = i; + QBENCHMARK { + for (int i = 0; i < million; ++i) + accumulate += i; + } +} + +///////////////////// QVector ///////////////////// + +void tst_QVector::qvector_const_read_access() +{ + QVector<double> v(million); + for (int i = 0; i < million; ++i) + v[i] = i; + + const QVector<double> &vc = v; + QBENCHMARK { + for (int i = 0; i < million; ++i) + accumulate += vc[i]; + } +} + +void tst_QVector::qvector_mutable_read_access() +{ + QVector<double> v(million); + for (int i = 0; i < million; ++i) + v[i] = i; + + QBENCHMARK { + for (int i = 0; i < million; ++i) + accumulate += v[i]; + } +} + +void tst_QVector::qvector_fill_and_return() +{ + QBENCHMARK { + QVector<double> v = qvector_fill_and_return_helper(); + accumulate += v[1]; + } +} + +///////////////////// QRawVector ///////////////////// + +void tst_QVector::qrawvector_const_read_access() +{ + QRawVector<double> v(million); + for (int i = 0; i < million; ++i) + v[i] = i; + + const QRawVector<double> &vc = v; + QBENCHMARK { + for (int i = vc.size(); --i >= 0;) + accumulate += vc[i]; + } +} + +void tst_QVector::qrawvector_mutable_read_access() +{ + QRawVector<double> v(million); + for (int i = 0; i < million; ++i) + v[i] = i; + + QBENCHMARK { + for (int i = 0; i < million; ++i) + accumulate += v[i]; + } +} + +void tst_QVector::qvector_pop_back() +{ + const int c1 = 100000; + QVERIFY(million % c1 == 0); + + QVector<int> v; + v.resize(million); + + QBENCHMARK { + for (int i = 0; i < c1; ++i) + v.pop_back(); + if (v.size() == 0) + v.resize(million); + } +} + +#if TEST_RAW +void tst_QVector::qrawvector_fill_and_return() +{ + QBENCHMARK { + QVector<double> v = qrawvector_fill_and_return_helper(); + accumulate += v[1]; + } +} +#endif + +///////////////////// std::vector ///////////////////// + +void tst_QVector::stdvector_const_read_access() +{ + std::vector<double> v(million); + for (int i = 0; i < million; ++i) + v[i] = i; + + const std::vector<double> &vc = v; + QBENCHMARK { + for (int i = 0; i < million; ++i) + accumulate += vc[i]; + } +} + +void tst_QVector::stdvector_mutable_read_access() +{ + std::vector<double> v(million); + for (int i = 0; i < million; ++i) + v[i] = i; + + QBENCHMARK { + for (int i = 0; i < million; ++i) + accumulate += v[i]; + } +} + +void tst_QVector::stdvector_pop_back() +{ + const int size = million / 10; + QVERIFY(million % size == 0); + + std::vector<int> v; + v.resize(million); + + QBENCHMARK { + for (int i = 0; i < size; ++i) + v.pop_back(); + if (v.size() == 0) + v.resize(million); + } +} + +void tst_QVector::stdvector_fill_and_return() +{ + QBENCHMARK { + std::vector<double> v = stdvector_fill_and_return_helper(); + accumulate += v[1]; + } +} + +///////////////////// mixed vector ///////////////////// + +void tst_QVector::mixedvector_fill_and_return() +{ + QBENCHMARK { + std::vector<double> v = stdvector_fill_and_return_helper(); + accumulate += v[1]; + } +} + +QTEST_MAIN(tst_QVector) + +#include "tst_bench_qvector.moc" |