summaryrefslogtreecommitdiffstats
path: root/tests/benchmarks/corelib
diff options
context:
space:
mode:
Diffstat (limited to 'tests/benchmarks/corelib')
-rw-r--r--tests/benchmarks/corelib/CMakeLists.txt5
-rw-r--r--tests/benchmarks/corelib/io/CMakeLists.txt8
-rw-r--r--tests/benchmarks/corelib/io/qdir/10000/CMakeLists.txt10
-rw-r--r--tests/benchmarks/corelib/io/qdir/10000/tst_bench_qdir_10000.cpp (renamed from tests/benchmarks/corelib/io/qdir/10000/bench_qdir_10000.cpp)157
-rw-r--r--tests/benchmarks/corelib/io/qdir/CMakeLists.txt3
-rw-r--r--tests/benchmarks/corelib/io/qdir/tree/4.6.0-list.txt2
-rw-r--r--tests/benchmarks/corelib/io/qdir/tree/CMakeLists.txt21
-rw-r--r--tests/benchmarks/corelib/io/qdir/tree/tst_bench_qdir_tree.cpp (renamed from tests/benchmarks/corelib/io/qdir/tree/bench_qdir_tree.cpp)78
-rw-r--r--tests/benchmarks/corelib/io/qdir/tree/tst_bench_qdir_tree.qrc (renamed from tests/benchmarks/corelib/io/qdir/tree/bench_qdir_tree.qrc)0
-rw-r--r--tests/benchmarks/corelib/io/qdiriterator/CMakeLists.txt7
-rw-r--r--tests/benchmarks/corelib/io/qdiriterator/qfilesystemiterator.cpp31
-rw-r--r--tests/benchmarks/corelib/io/qdiriterator/qfilesystemiterator.h29
-rw-r--r--tests/benchmarks/corelib/io/qdiriterator/tst_bench_qdiriterator.cpp (renamed from tests/benchmarks/corelib/io/qdiriterator/main.cpp)157
-rw-r--r--tests/benchmarks/corelib/io/qfile/CMakeLists.txt10
-rw-r--r--tests/benchmarks/corelib/io/qfile/main.cpp707
-rw-r--r--tests/benchmarks/corelib/io/qfile/tst_bench_qfile.cpp593
-rw-r--r--tests/benchmarks/corelib/io/qfileinfo/CMakeLists.txt10
-rw-r--r--tests/benchmarks/corelib/io/qfileinfo/main.cpp115
-rw-r--r--tests/benchmarks/corelib/io/qfileinfo/tst_bench_qfileinfo.cpp77
-rw-r--r--tests/benchmarks/corelib/io/qiodevice/CMakeLists.txt10
-rw-r--r--tests/benchmarks/corelib/io/qiodevice/tst_bench_qiodevice.cpp (renamed from tests/benchmarks/corelib/io/qiodevice/main.cpp)42
-rw-r--r--tests/benchmarks/corelib/io/qprocess/CMakeLists.txt3
-rw-r--r--tests/benchmarks/corelib/io/qprocess/test/CMakeLists.txt5
-rw-r--r--tests/benchmarks/corelib/io/qprocess/testProcessLoopback/CMakeLists.txt11
-rw-r--r--tests/benchmarks/corelib/io/qprocess/testProcessLoopback/loopback.cpp19
-rw-r--r--tests/benchmarks/corelib/io/qprocess/testProcessLoopback/main.cpp44
-rw-r--r--tests/benchmarks/corelib/io/qprocess/tst_bench_qprocess.cpp41
-rw-r--r--tests/benchmarks/corelib/io/qtemporaryfile/CMakeLists.txt10
-rw-r--r--tests/benchmarks/corelib/io/qtemporaryfile/main.cpp90
-rw-r--r--tests/benchmarks/corelib/io/qtemporaryfile/tst_bench_qtemporaryfile.cpp64
-rw-r--r--tests/benchmarks/corelib/io/qtextstream/CMakeLists.txt10
-rw-r--r--tests/benchmarks/corelib/io/qtextstream/tst_bench_qtextstream.cpp (renamed from tests/benchmarks/corelib/io/qtextstream/main.cpp)39
-rw-r--r--tests/benchmarks/corelib/io/qurl/CMakeLists.txt14
-rw-r--r--tests/benchmarks/corelib/io/qurl/tst_bench_qurl.cpp (renamed from tests/benchmarks/corelib/io/qurl/main.cpp)75
-rw-r--r--tests/benchmarks/corelib/itemmodels/CMakeLists.txt1
-rw-r--r--tests/benchmarks/corelib/itemmodels/qsortfilterproxymodel/CMakeLists.txt9
-rw-r--r--tests/benchmarks/corelib/itemmodels/qsortfilterproxymodel/tst_bench_qsortfilterproxymodel.cpp112
-rw-r--r--tests/benchmarks/corelib/json/CMakeLists.txt8
-rw-r--r--tests/benchmarks/corelib/json/tst_bench_qtjson.cpp30
-rw-r--r--tests/benchmarks/corelib/kernel/CMakeLists.txt4
-rw-r--r--tests/benchmarks/corelib/kernel/events/CMakeLists.txt10
-rw-r--r--tests/benchmarks/corelib/kernel/events/tst_bench_events.cpp (renamed from tests/benchmarks/corelib/kernel/events/main.cpp)32
-rw-r--r--tests/benchmarks/corelib/kernel/qcoreapplication/CMakeLists.txt10
-rw-r--r--tests/benchmarks/corelib/kernel/qcoreapplication/main.cpp69
-rw-r--r--tests/benchmarks/corelib/kernel/qcoreapplication/tst_bench_qcoreapplication.cpp70
-rw-r--r--tests/benchmarks/corelib/kernel/qmetaenum/CMakeLists.txt10
-rw-r--r--tests/benchmarks/corelib/kernel/qmetaenum/tst_bench_qmetaenum.cpp55
-rw-r--r--tests/benchmarks/corelib/kernel/qmetaobject/CMakeLists.txt10
-rw-r--r--tests/benchmarks/corelib/kernel/qmetaobject/tst_bench_qmetaobject.cpp (renamed from tests/benchmarks/corelib/kernel/qmetaobject/main.cpp)75
-rw-r--r--tests/benchmarks/corelib/kernel/qmetatype/CMakeLists.txt10
-rw-r--r--tests/benchmarks/corelib/kernel/qmetatype/tst_bench_qmetatype.cpp (renamed from tests/benchmarks/corelib/kernel/qmetatype/tst_qmetatype.cpp)118
-rw-r--r--tests/benchmarks/corelib/kernel/qobject/CMakeLists.txt10
-rw-r--r--tests/benchmarks/corelib/kernel/qobject/object.cpp29
-rw-r--r--tests/benchmarks/corelib/kernel/qobject/object.h29
-rw-r--r--tests/benchmarks/corelib/kernel/qobject/tst_bench_qobject.cpp (renamed from tests/benchmarks/corelib/kernel/qobject/main.cpp)57
-rw-r--r--tests/benchmarks/corelib/kernel/qproperty/CMakeLists.txt7
-rw-r--r--tests/benchmarks/corelib/kernel/qproperty/propertytester.h29
-rw-r--r--tests/benchmarks/corelib/kernel/qproperty/tst_bench_qproperty.cpp (renamed from tests/benchmarks/corelib/kernel/qproperty/main.cpp)60
-rw-r--r--tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/CMakeLists.txt8
-rw-r--r--tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/tst_qtimer_vs_qmetaobject.cpp33
-rw-r--r--tests/benchmarks/corelib/kernel/qvariant/CMakeLists.txt14
-rw-r--r--tests/benchmarks/corelib/kernel/qvariant/tst_bench_qvariant.cpp (renamed from tests/benchmarks/corelib/kernel/qvariant/tst_qvariant.cpp)103
-rw-r--r--tests/benchmarks/corelib/kernel/qwineventnotifier/CMakeLists.txt10
-rw-r--r--tests/benchmarks/corelib/kernel/qwineventnotifier/tst_bench_qwineventnotifier.cpp (renamed from tests/benchmarks/corelib/kernel/qwineventnotifier/main.cpp)39
-rw-r--r--tests/benchmarks/corelib/mimetypes/CMakeLists.txt3
-rw-r--r--tests/benchmarks/corelib/mimetypes/qmimedatabase/CMakeLists.txt7
-rw-r--r--tests/benchmarks/corelib/mimetypes/qmimedatabase/files/N.tar.gzbin0 -> 115 bytes
-rw-r--r--tests/benchmarks/corelib/mimetypes/qmimedatabase/files/X1
-rw-r--r--tests/benchmarks/corelib/mimetypes/qmimedatabase/files/t.c1
-rw-r--r--tests/benchmarks/corelib/mimetypes/qmimedatabase/files/u.txt4
-rw-r--r--tests/benchmarks/corelib/mimetypes/qmimedatabase/files/y1
-rw-r--r--tests/benchmarks/corelib/mimetypes/qmimedatabase/files/zbin0 -> 132 bytes
-rw-r--r--tests/benchmarks/corelib/mimetypes/qmimedatabase/main.cpp86
-rw-r--r--tests/benchmarks/corelib/mimetypes/qmimedatabase/tst_bench_qmimedatabase.cpp146
-rw-r--r--tests/benchmarks/corelib/plugin/CMakeLists.txt3
-rw-r--r--tests/benchmarks/corelib/plugin/quuid/CMakeLists.txt10
-rw-r--r--tests/benchmarks/corelib/plugin/quuid/tst_bench_quuid.cpp (renamed from tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp)87
-rw-r--r--tests/benchmarks/corelib/serialization/CMakeLists.txt4
-rw-r--r--tests/benchmarks/corelib/serialization/qcborvalue/CMakeLists.txt10
-rw-r--r--tests/benchmarks/corelib/serialization/qcborvalue/tst_bench_qcborvalue.cpp95
-rw-r--r--tests/benchmarks/corelib/text/CMakeLists.txt9
-rw-r--r--tests/benchmarks/corelib/text/qbytearray/CMakeLists.txt11
-rw-r--r--tests/benchmarks/corelib/text/qbytearray/tst_bench_qbytearray.cpp (renamed from tests/benchmarks/corelib/text/qbytearray/main.cpp)211
-rw-r--r--tests/benchmarks/corelib/text/qchar/CMakeLists.txt7
-rw-r--r--tests/benchmarks/corelib/text/qchar/tst_bench_qchar.cpp (renamed from tests/benchmarks/corelib/text/qchar/main.cpp)31
-rw-r--r--tests/benchmarks/corelib/text/qlocale/CMakeLists.txt7
-rw-r--r--tests/benchmarks/corelib/text/qlocale/main.cpp397
-rw-r--r--tests/benchmarks/corelib/text/qlocale/tst_bench_qlocale.cpp593
-rw-r--r--tests/benchmarks/corelib/text/qregularexpression/CMakeLists.txt5
-rw-r--r--tests/benchmarks/corelib/text/qregularexpression/tst_bench_qregularexpression.cpp29
-rw-r--r--tests/benchmarks/corelib/text/qstring/CMakeLists.txt7
-rw-r--r--tests/benchmarks/corelib/text/qstring/main.cpp192
-rw-r--r--tests/benchmarks/corelib/text/qstring/tst_bench_qstring.cpp510
-rw-r--r--tests/benchmarks/corelib/text/qstringbuilder/CMakeLists.txt11
-rw-r--r--tests/benchmarks/corelib/text/qstringbuilder/tst_bench_qstringbuilder.cpp (renamed from tests/benchmarks/corelib/text/qstringbuilder/main.cpp)39
-rw-r--r--tests/benchmarks/corelib/text/qstringlist/CMakeLists.txt7
-rw-r--r--tests/benchmarks/corelib/text/qstringlist/tst_bench_qstringlist.cpp (renamed from tests/benchmarks/corelib/text/qstringlist/main.cpp)93
-rw-r--r--tests/benchmarks/corelib/text/qstringtokenizer/CMakeLists.txt20
-rw-r--r--tests/benchmarks/corelib/text/qstringtokenizer/data/lorem.txt40
-rw-r--r--tests/benchmarks/corelib/text/qstringtokenizer/tst_bench_qstringtokenizer.cpp120
-rw-r--r--tests/benchmarks/corelib/text/qutf8stringview/CMakeLists.txt14
-rw-r--r--tests/benchmarks/corelib/text/qutf8stringview/tst_bench_qutf8stringview.cpp263
-rw-r--r--tests/benchmarks/corelib/thread/CMakeLists.txt4
-rw-r--r--tests/benchmarks/corelib/thread/qfuture/CMakeLists.txt14
-rw-r--r--tests/benchmarks/corelib/thread/qfuture/tst_bench_qfuture.cpp297
-rw-r--r--tests/benchmarks/corelib/thread/qmutex/CMakeLists.txt11
-rw-r--r--tests/benchmarks/corelib/thread/qmutex/tst_bench_qmutex.cpp (renamed from tests/benchmarks/corelib/thread/qmutex/tst_qmutex.cpp)83
-rw-r--r--tests/benchmarks/corelib/thread/qreadwritelock/CMakeLists.txt10
-rw-r--r--tests/benchmarks/corelib/thread/qreadwritelock/tst_bench_qreadwritelock.cpp (renamed from tests/benchmarks/corelib/thread/qreadwritelock/tst_qreadwritelock.cpp)99
-rw-r--r--tests/benchmarks/corelib/thread/qthreadpool/CMakeLists.txt10
-rw-r--r--tests/benchmarks/corelib/thread/qthreadpool/tst_bench_qthreadpool.cpp55
-rw-r--r--tests/benchmarks/corelib/thread/qthreadpool/tst_qthreadpool.cpp79
-rw-r--r--tests/benchmarks/corelib/thread/qthreadstorage/CMakeLists.txt10
-rw-r--r--tests/benchmarks/corelib/thread/qthreadstorage/tst_bench_qthreadstorage.cpp85
-rw-r--r--tests/benchmarks/corelib/thread/qthreadstorage/tst_qthreadstorage.cpp109
-rw-r--r--tests/benchmarks/corelib/thread/qwaitcondition/CMakeLists.txt10
-rw-r--r--tests/benchmarks/corelib/thread/qwaitcondition/tst_bench_qwaitcondition.cpp174
-rw-r--r--tests/benchmarks/corelib/thread/qwaitcondition/tst_qwaitcondition.cpp129
-rw-r--r--tests/benchmarks/corelib/time/CMakeLists.txt3
-rw-r--r--tests/benchmarks/corelib/time/qdate/CMakeLists.txt5
-rw-r--r--tests/benchmarks/corelib/time/qdate/tst_bench_qdate.cpp66
-rw-r--r--tests/benchmarks/corelib/time/qdatetime/CMakeLists.txt8
-rw-r--r--tests/benchmarks/corelib/time/qdatetime/tst_bench_qdatetime.cpp (renamed from tests/benchmarks/corelib/time/qdatetime/main.cpp)195
-rw-r--r--tests/benchmarks/corelib/time/qtimezone/CMakeLists.txt7
-rw-r--r--tests/benchmarks/corelib/time/qtimezone/tst_bench_qtimezone.cpp (renamed from tests/benchmarks/corelib/time/qtimezone/main.cpp)79
-rw-r--r--tests/benchmarks/corelib/tools/CMakeLists.txt6
-rw-r--r--tests/benchmarks/corelib/tools/containers-associative/CMakeLists.txt14
-rw-r--r--tests/benchmarks/corelib/tools/containers-associative/tst_bench_containers_associative.cpp (renamed from tests/benchmarks/corelib/tools/containers-associative/main.cpp)34
-rw-r--r--tests/benchmarks/corelib/tools/containers-sequential/CMakeLists.txt12
-rw-r--r--tests/benchmarks/corelib/tools/containers-sequential/tst_bench_containers_sequential.cpp (renamed from tests/benchmarks/corelib/tools/containers-sequential/main.cpp)44
-rw-r--r--tests/benchmarks/corelib/tools/qcontiguouscache/CMakeLists.txt7
-rw-r--r--tests/benchmarks/corelib/tools/qcontiguouscache/tst_bench_qcontiguouscache.cpp (renamed from tests/benchmarks/corelib/tools/qcontiguouscache/main.cpp)35
-rw-r--r--tests/benchmarks/corelib/tools/qcryptographichash/CMakeLists.txt7
-rw-r--r--tests/benchmarks/corelib/tools/qcryptographichash/main.cpp172
-rw-r--r--tests/benchmarks/corelib/tools/qcryptographichash/tst_bench_qcryptographichash.cpp223
-rw-r--r--tests/benchmarks/corelib/tools/qhash/CMakeLists.txt13
-rw-r--r--tests/benchmarks/corelib/tools/qhash/main.h61
-rw-r--r--tests/benchmarks/corelib/tools/qhash/outofline.cpp47
-rw-r--r--tests/benchmarks/corelib/tools/qhash/tst_bench_qhash.cpp (renamed from tests/benchmarks/corelib/tools/qhash/main.cpp)90
-rw-r--r--tests/benchmarks/corelib/tools/qhash/tst_bench_qhash.h48
-rw-r--r--tests/benchmarks/corelib/tools/qlist/CMakeLists.txt7
-rw-r--r--tests/benchmarks/corelib/tools/qlist/main.cpp560
-rw-r--r--tests/benchmarks/corelib/tools/qlist/tst_bench_qlist.cpp410
-rw-r--r--tests/benchmarks/corelib/tools/qmap/CMakeLists.txt7
-rw-r--r--tests/benchmarks/corelib/tools/qmap/tst_bench_qmap.cpp (renamed from tests/benchmarks/corelib/tools/qmap/main.cpp)149
-rw-r--r--tests/benchmarks/corelib/tools/qrect/CMakeLists.txt10
-rw-r--r--tests/benchmarks/corelib/tools/qrect/tst_bench_qrect.cpp (renamed from tests/benchmarks/corelib/tools/qrect/main.cpp)85
-rw-r--r--tests/benchmarks/corelib/tools/qringbuffer/CMakeLists.txt10
-rw-r--r--tests/benchmarks/corelib/tools/qringbuffer/main.cpp71
-rw-r--r--tests/benchmarks/corelib/tools/qringbuffer/tst_bench_qringbuffer.cpp46
-rw-r--r--tests/benchmarks/corelib/tools/qset/CMakeLists.txt11
-rw-r--r--tests/benchmarks/corelib/tools/qset/tst_bench_qset.cpp (renamed from tests/benchmarks/corelib/tools/qset/main.cpp)105
-rw-r--r--tests/benchmarks/corelib/tools/qsharedpointer/CMakeLists.txt12
-rw-r--r--tests/benchmarks/corelib/tools/qsharedpointer/tst_bench_shared_ptr.cpp111
-rw-r--r--tests/benchmarks/corelib/tools/qstack/CMakeLists.txt11
-rw-r--r--tests/benchmarks/corelib/tools/qstack/main.cpp84
-rw-r--r--tests/benchmarks/corelib/tools/qstack/tst_bench_qstack.cpp59
-rw-r--r--tests/benchmarks/corelib/tools/qvector/CMakeLists.txt11
-rw-r--r--tests/benchmarks/corelib/tools/qvector/main.cpp414
-rw-r--r--tests/benchmarks/corelib/tools/qvector/outofline.cpp55
-rw-r--r--tests/benchmarks/corelib/tools/qvector/qrawvector.h40
-rw-r--r--tests/benchmarks/corelib/tools/qvector/tst_bench_qvector.cpp228
162 files changed, 6075 insertions, 5408 deletions
diff --git a/tests/benchmarks/corelib/CMakeLists.txt b/tests/benchmarks/corelib/CMakeLists.txt
index a84f317928..855e7ee2fa 100644
--- a/tests/benchmarks/corelib/CMakeLists.txt
+++ b/tests/benchmarks/corelib/CMakeLists.txt
@@ -1,6 +1,8 @@
-# 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)
add_subdirectory(kernel)
@@ -9,3 +11,4 @@ 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 894cf83de9..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,19 +120,30 @@ 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);
}
}
}
- 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..f1800fc0cd 100644
--- a/tests/benchmarks/corelib/io/qdir/CMakeLists.txt
+++ b/tests/benchmarks/corelib/io/qdir/CMakeLists.txt
@@ -1,3 +1,2 @@
-# Generated from qdir.pro.
-
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/main.cpp
deleted file mode 100644
index 3cf9709d09..0000000000
--- a/tests/benchmarks/corelib/io/qfileinfo/main.cpp
+++ /dev/null
@@ -1,115 +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 <qtest.h>
-#include <QTest>
-#include <QtCore/QCoreApplication>
-#include <QtCore/QFileInfo>
-#include <QtCore/QFile>
-
-#include "private/qfsfileengine_p.h"
-#include "../../../../shared/filesystem.h"
-
-class qfileinfo : public QObject
-{
- Q_OBJECT
-private slots:
- void existsTemporary();
- void existsStatic();
-#if defined(Q_OS_WIN)
- void symLinkTargetPerformanceLNK();
- void symLinkTargetPerformanceMounpoint();
-#endif
- void initTestCase();
- void cleanupTestCase();
-public:
- qfileinfo() : QObject() {};
-};
-
-void qfileinfo::initTestCase()
-{
-}
-
-void qfileinfo::cleanupTestCase()
-{
-}
-
-void qfileinfo::existsTemporary()
-{
- QString appPath = QCoreApplication::applicationFilePath();
- QBENCHMARK { QFileInfo(appPath).exists(); }
-}
-
-void qfileinfo::existsStatic()
-{
- QString appPath = QCoreApplication::applicationFilePath();
- QBENCHMARK { QFileInfo::exists(appPath); }
-}
-
-#if defined(Q_OS_WIN)
-void qfileinfo::symLinkTargetPerformanceLNK()
-{
- QVERIFY(QFile::link("file","link.lnk"));
- QFileInfo info("link.lnk");
- info.setCaching(false);
- QVERIFY(info.isSymLink());
- QString linkTarget;
- QBENCHMARK {
- for(int i=0; i<100; i++)
- linkTarget = info.symLinkTarget();
- }
- QVERIFY(QFile::remove("link.lnk"));
-}
-
-void qfileinfo::symLinkTargetPerformanceMounpoint()
-{
- wchar_t buffer[MAX_PATH];
- QString rootPath = QDir::toNativeSeparators(QDir::rootPath());
- QVERIFY(GetVolumeNameForVolumeMountPointW((LPCWSTR)rootPath.utf16(), buffer, MAX_PATH));
- QString rootVolume = QString::fromWCharArray(buffer);
- QString mountpoint = "mountpoint";
- rootVolume.replace("\\\\?\\","\\??\\");
- QString errorMessage;
- QVERIFY2(FileSystem::createNtfsJunction(rootVolume, mountpoint, &errorMessage) == ERROR_SUCCESS,
- qPrintable(errorMessage));
-
- QFileInfo info(mountpoint);
- info.setCaching(false);
- QVERIFY(info.isSymLink());
- QString linkTarget;
- QBENCHMARK {
- for(int i=0; i<100; i++)
- linkTarget = info.symLinkTarget();
- }
- QVERIFY(QDir().rmdir(mountpoint));
-}
-#endif
-
-QTEST_MAIN(qfileinfo)
-
-#include "main.moc"
diff --git a/tests/benchmarks/corelib/io/qfileinfo/tst_bench_qfileinfo.cpp b/tests/benchmarks/corelib/io/qfileinfo/tst_bench_qfileinfo.cpp
new file mode 100644
index 0000000000..2c626dde70
--- /dev/null
+++ b/tests/benchmarks/corelib/io/qfileinfo/tst_bench_qfileinfo.cpp
@@ -0,0 +1,77 @@
+// 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>
+#include <QtCore/QCoreApplication>
+#include <QtCore/QFileInfo>
+#include <QtCore/QFile>
+
+#include "private/qfsfileengine_p.h"
+#include "../../../../shared/filesystem.h"
+
+class tst_QFileInfo : public QObject
+{
+ Q_OBJECT
+private slots:
+ void existsTemporary();
+ void existsStatic();
+#if defined(Q_OS_WIN)
+ void symLinkTargetPerformanceLNK();
+ void junctionTargetPerformanceMountpoint();
+#endif
+};
+
+void tst_QFileInfo::existsTemporary()
+{
+ QString appPath = QCoreApplication::applicationFilePath();
+ QBENCHMARK { QFileInfo(appPath).exists(); }
+}
+
+void tst_QFileInfo::existsStatic()
+{
+ QString appPath = QCoreApplication::applicationFilePath();
+ QBENCHMARK { QFileInfo::exists(appPath); }
+}
+
+#if defined(Q_OS_WIN)
+void tst_QFileInfo::symLinkTargetPerformanceLNK()
+{
+ QVERIFY(QFile::link("file","link.lnk"));
+ QFileInfo info("link.lnk");
+ info.setCaching(false);
+ QVERIFY(info.isSymLink());
+ QString linkTarget;
+ QBENCHMARK {
+ for(int i=0; i<100; i++)
+ linkTarget = info.symLinkTarget();
+ }
+ QVERIFY(QFile::remove("link.lnk"));
+}
+
+void tst_QFileInfo::junctionTargetPerformanceMountpoint()
+{
+ wchar_t buffer[MAX_PATH];
+ QString rootPath = QDir::toNativeSeparators(QDir::rootPath());
+ QVERIFY(GetVolumeNameForVolumeMountPointW((LPCWSTR)rootPath.utf16(), buffer, MAX_PATH));
+ QString rootVolume = QString::fromWCharArray(buffer);
+ QString mountpoint = "mountpoint";
+ rootVolume.replace("\\\\?\\","\\??\\");
+ const auto result = FileSystem::createNtfsJunction(rootVolume, mountpoint);
+ QVERIFY2(result.dwErr == ERROR_SUCCESS, qPrintable(result.errorMessage));
+
+ QFileInfo info(mountpoint);
+ info.setCaching(false);
+ QVERIFY(info.isJunction());
+ QString junctionTarget;
+ QBENCHMARK {
+ for(int i=0; i<100; i++)
+ junctionTarget = info.junctionTarget();
+ }
+ QVERIFY(QDir().rmdir(mountpoint));
+}
+#endif
+
+QTEST_MAIN(tst_QFileInfo)
+
+#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 02c50f7df2..cd486bd9cc 100644
--- a/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/CMakeLists.txt
+++ b/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/CMakeLists.txt
@@ -1,13 +1,8 @@
-# Generated from testProcessLoopback.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## testProcessLoopback Binary:
#####################################################################
-qt_internal_add_benchmark(testProcessLoopback
- OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/"
- SOURCES
- main.cpp
- PUBLIC_LIBRARIES
- Qt::Gui
-)
+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
new file mode 100644
index 0000000000..c74f36709c
--- /dev/null
+++ b/tests/benchmarks/corelib/itemmodels/CMakeLists.txt
@@ -0,0 +1 @@
+add_subdirectory(qsortfilterproxymodel)
diff --git a/tests/benchmarks/corelib/itemmodels/qsortfilterproxymodel/CMakeLists.txt b/tests/benchmarks/corelib/itemmodels/qsortfilterproxymodel/CMakeLists.txt
new file mode 100644
index 0000000000..f6f45fa1f4
--- /dev/null
+++ b/tests/benchmarks/corelib/itemmodels/qsortfilterproxymodel/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+qt_internal_add_benchmark(tst_bench_qsortfilterproxymodel
+ SOURCES
+ tst_bench_qsortfilterproxymodel.cpp
+ LIBRARIES
+ Qt::Test
+)
diff --git a/tests/benchmarks/corelib/itemmodels/qsortfilterproxymodel/tst_bench_qsortfilterproxymodel.cpp b/tests/benchmarks/corelib/itemmodels/qsortfilterproxymodel/tst_bench_qsortfilterproxymodel.cpp
new file mode 100644
index 0000000000..0411972ce3
--- /dev/null
+++ b/tests/benchmarks/corelib/itemmodels/qsortfilterproxymodel/tst_bench_qsortfilterproxymodel.cpp
@@ -0,0 +1,112 @@
+// Copyright (C) 2021 Igor Kushnir <igorkuo@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include <QSortFilterProxyModel>
+#include <QString>
+#include <QStringList>
+#include <QStringListModel>
+#include <QTest>
+
+static void resizeNumberList(QStringList &numberList, int size)
+{
+ if (!numberList.empty())
+ QCOMPARE(numberList.constLast(), QString::number(numberList.size()));
+
+ if (numberList.size() < size) {
+ numberList.reserve(size);
+ for (int i = numberList.size() + 1; i <= size; ++i)
+ numberList.push_back(QString::number(i));
+ } else if (numberList.size() > size) {
+ numberList.erase(numberList.begin() + size, numberList.end());
+ }
+
+ QCOMPARE(numberList.size(), size);
+ if (!numberList.empty())
+ QCOMPARE(numberList.constLast(), QString::number(numberList.size()));
+}
+
+class tst_QSortFilterProxyModel : public QObject
+{
+ Q_OBJECT
+private slots:
+ void clearFilter_data();
+ void clearFilter();
+ void setSourceModel();
+
+private:
+ QStringList m_numberList; ///< Cache the strings for efficiency.
+};
+
+void tst_QSortFilterProxyModel::clearFilter_data()
+{
+ QTest::addColumn<int>("itemCount");
+ QTest::addColumn<QString>("pattern");
+ QTest::addColumn<int>("filteredRowCount");
+
+ const auto matchSingleItem = [](int item) { return QStringLiteral("^%1$").arg(item); };
+
+ for (int thousandItemCount : { 10, 25, 50, 100, 250, 500, 1000, 2000 }) {
+ const auto itemCount = thousandItemCount * 1000;
+
+ QTest::addRow("no match in %dK", thousandItemCount) << itemCount << "-" << 0;
+ QTest::addRow("match all in %dK", thousandItemCount) << itemCount << "\\d+" << itemCount;
+
+ QTest::addRow("match first in %dK", thousandItemCount)
+ << itemCount << matchSingleItem(1) << 1;
+ QTest::addRow("match 1000th in %dK", thousandItemCount)
+ << itemCount << matchSingleItem(1000) << 1;
+ QTest::addRow("match middle in %dK", thousandItemCount)
+ << itemCount << matchSingleItem(itemCount / 2) << 1;
+ QTest::addRow("match 1000th from end in %dK", thousandItemCount)
+ << itemCount << matchSingleItem(itemCount - 999) << 1;
+ QTest::addRow("match last in %dK", thousandItemCount)
+ << itemCount << matchSingleItem(itemCount) << 1;
+
+ QTest::addRow("match each 10'000th in %dK", thousandItemCount)
+ << itemCount << "0000$" << thousandItemCount / 10;
+ QTest::addRow("match each 100'000th in %dK", thousandItemCount)
+ << itemCount << "00000$" << thousandItemCount / 100;
+ }
+}
+
+void tst_QSortFilterProxyModel::clearFilter()
+{
+ QFETCH(const int, itemCount);
+ resizeNumberList(m_numberList, itemCount);
+ QStringListModel model(std::as_const(m_numberList));
+ QCOMPARE(model.rowCount(), itemCount);
+
+ QSortFilterProxyModel proxy;
+ proxy.setSourceModel(&model);
+ QCOMPARE(model.rowCount(), itemCount);
+ QCOMPARE(proxy.rowCount(), itemCount);
+
+ QFETCH(const QString, pattern);
+ QFETCH(const int, filteredRowCount);
+ proxy.setFilterRegularExpression(pattern);
+ QCOMPARE(model.rowCount(), itemCount);
+ QCOMPARE(proxy.rowCount(), filteredRowCount);
+
+ QBENCHMARK_ONCE {
+ proxy.setFilterRegularExpression(QString());
+ }
+ QCOMPARE(model.rowCount(), itemCount);
+ 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_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 80bad7977b..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,19 +197,20 @@ 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);
- QVERIFY(obj->metaObject()->methodCount() == 73);
+ // 74: 70 signals in LotsOfSignals, 2 signals, 1 slot + 1 invokable in QObject
+ QCOMPARE(obj->metaObject()->methodCount(), 74);
void *v;
QBENCHMARK {
- //+1 because QObject has one slot
- QMetaObject::metacall(obj, QMetaObject::InvokeMetaMethod, signal_index+1, &v);
+ // Add two because QObject has one slot and one invokable
+ QMetaObject::metacall(obj, QMetaObject::InvokeMetaMethod, signal_index + 2, &v);
}
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 126af8adde..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>
@@ -85,9 +60,8 @@ void tst_QMetaType::typeBuiltin_data()
{
QTest::addColumn<QByteArray>("typeName");
for (int i = 0; i < QMetaType::User; ++i) {
- const char *name = QMetaType::typeName(i);
- if (name)
- QTest::newRow(name) << QByteArray(name);
+ if (QMetaType metaType(i); metaType.isValid())
+ QTest::newRow(metaType.name()) << QByteArray(metaType.name());
}
}
@@ -98,7 +72,7 @@ void tst_QMetaType::typeBuiltin()
const char *nm = typeName.constData();
QBENCHMARK {
for (int i = 0; i < 100000; ++i)
- QMetaType::type(nm);
+ QMetaType::fromName(nm);
}
}
@@ -113,7 +87,7 @@ void tst_QMetaType::typeBuiltin_QByteArray()
QFETCH(QByteArray, typeName);
QBENCHMARK {
for (int i = 0; i < 100000; ++i)
- QMetaType::type(typeName);
+ QMetaType::fromName(typeName);
}
}
@@ -121,9 +95,8 @@ void tst_QMetaType::typeBuiltinNotNormalized_data()
{
QTest::addColumn<QByteArray>("typeName");
for (int i = 0; i < QMetaType::User; ++i) {
- const char *name = QMetaType::typeName(i);
- if (name)
- QTest::newRow(name) << QByteArray(name).append(" ");
+ if (QMetaType metaType(i); metaType.isValid())
+ QTest::newRow(metaType.name()) << QByteArray(metaType.name()).append(" ");
}
}
@@ -133,7 +106,7 @@ void tst_QMetaType::typeBuiltinNotNormalized()
const char *nm = typeName.constData();
QBENCHMARK {
for (int i = 0; i < 10000; ++i)
- QMetaType::type(nm);
+ QMetaType::fromName(nm);
}
}
@@ -144,7 +117,7 @@ void tst_QMetaType::typeCustom()
qRegisterMetaType<Foo>("Foo");
QBENCHMARK {
for (int i = 0; i < 10000; ++i)
- QMetaType::type("Foo");
+ QMetaType::fromName("Foo");
}
}
@@ -153,25 +126,25 @@ void tst_QMetaType::typeCustomNotNormalized()
qRegisterMetaType<Foo>("Foo");
QBENCHMARK {
for (int i = 0; i < 10000; ++i)
- QMetaType::type("Foo ");
+ QMetaType::fromName("Foo ");
}
}
void tst_QMetaType::typeNotRegistered()
{
- Q_ASSERT(QMetaType::type("Bar") == 0);
+ Q_ASSERT(!QMetaType::fromName("Bar").isValid());
QBENCHMARK {
for (int i = 0; i < 10000; ++i)
- QMetaType::type("Bar");
+ QMetaType::fromName("Bar");
}
}
void tst_QMetaType::typeNotRegisteredNotNormalized()
{
- Q_ASSERT(QMetaType::type("Bar") == 0);
+ Q_ASSERT(!QMetaType::fromName("Bar").isValid());
QBENCHMARK {
for (int i = 0; i < 10000; ++i)
- QMetaType::type("Bar ");
+ QMetaType::fromName("Bar ");
}
}
@@ -179,9 +152,8 @@ void tst_QMetaType::typeNameBuiltin_data()
{
QTest::addColumn<int>("type");
for (int i = 0; i < QMetaType::User; ++i) {
- const char *name = QMetaType::typeName(i);
- if (name)
- QTest::newRow(name) << i;
+ if (QMetaType metaType(i); metaType.isValid())
+ QTest::newRow(metaType.name()) << i;
}
}
@@ -190,7 +162,7 @@ void tst_QMetaType::typeNameBuiltin()
QFETCH(int, type);
QBENCHMARK {
for (int i = 0; i < 500000; ++i)
- QMetaType::typeName(type);
+ QMetaType(type).name();
}
}
@@ -199,17 +171,17 @@ void tst_QMetaType::typeNameCustom()
int type = qRegisterMetaType<Foo>("Foo");
QBENCHMARK {
for (int i = 0; i < 100000; ++i)
- QMetaType::typeName(type);
+ QMetaType(type).name();
}
}
void tst_QMetaType::typeNameNotRegistered()
{
// We don't care much about this case, but test it anyway.
- Q_ASSERT(QMetaType::typeName(-1) == 0);
+ Q_ASSERT(QMetaType(-1).name() == nullptr);
QBENCHMARK {
for (int i = 0; i < 500000; ++i)
- QMetaType::typeName(-1);
+ QMetaType(-1).name();
}
}
@@ -238,7 +210,7 @@ void tst_QMetaType::isRegisteredCustom()
void tst_QMetaType::isRegisteredNotRegistered()
{
- Q_ASSERT(QMetaType::typeName(-1) == 0);
+ Q_ASSERT(QMetaType(-1).name() == nullptr);
QBENCHMARK {
for (int i = 0; i < 100000; ++i)
QMetaType::isRegistered(-1);
@@ -249,7 +221,7 @@ void tst_QMetaType::constructInPlace_data()
{
QTest::addColumn<int>("typeId");
for (int i = QMetaType::FirstCoreType; i <= QMetaType::LastCoreType; ++i) {
- auto name = QMetaType::typeName(i);
+ auto name = QMetaType(i).name();
if (name && i != QMetaType::Void)
QTest::newRow(name) << i;
}
@@ -261,14 +233,15 @@ void tst_QMetaType::constructInPlace_data()
void tst_QMetaType::constructInPlace()
{
QFETCH(int, typeId);
- int size = QMetaType::sizeOf(typeId);
+ const QMetaType metaType(typeId);
+ size_t size = metaType.sizeOf();
void *storage = qMallocAligned(size, 2 * sizeof(qlonglong));
- QCOMPARE(QMetaType::construct(typeId, storage, /*copy=*/0), storage);
- QMetaType::destruct(typeId, storage);
+ QCOMPARE(metaType.construct(storage, /*copy=*/0), storage);
+ metaType.destruct(storage);
QBENCHMARK {
for (int i = 0; i < 100000; ++i) {
- QMetaType::construct(typeId, storage, /*copy=*/0);
- QMetaType::destruct(typeId, storage);
+ metaType.construct(storage, /*copy=*/0);
+ metaType.destruct(storage);
}
}
qFreeAligned(storage);
@@ -282,18 +255,19 @@ void tst_QMetaType::constructInPlaceCopy_data()
void tst_QMetaType::constructInPlaceCopy()
{
QFETCH(int, typeId);
- int size = QMetaType::sizeOf(typeId);
+ const QMetaType metaType(typeId);
+ size_t size = metaType.sizeOf();
void *storage = qMallocAligned(size, 2 * sizeof(qlonglong));
- void *other = QMetaType::create(typeId);
- QCOMPARE(QMetaType::construct(typeId, storage, other), storage);
- QMetaType::destruct(typeId, storage);
+ void *other = metaType.create();
+ QCOMPARE(metaType.construct(storage, other), storage);
+ metaType.destruct(storage);
QBENCHMARK {
for (int i = 0; i < 100000; ++i) {
- QMetaType::construct(typeId, storage, other);
- QMetaType::destruct(typeId, storage);
+ metaType.construct(storage, other);
+ metaType.destruct(storage);
}
}
- QMetaType::destroy(typeId, other);
+ metaType.destroy(other);
qFreeAligned(storage);
}
@@ -305,21 +279,21 @@ void tst_QMetaType::constructInPlaceCopyStaticLess_data()
void tst_QMetaType::constructInPlaceCopyStaticLess()
{
QFETCH(int, typeId);
- int size = QMetaType::sizeOf(typeId);
+ const QMetaType metaType(typeId);
+ size_t size = metaType.sizeOf();
void *storage = qMallocAligned(size, 2 * sizeof(qlonglong));
- void *other = QMetaType::create(typeId);
- QCOMPARE(QMetaType::construct(typeId, storage, other), storage);
- QMetaType::destruct(typeId, storage);
+ void *other = metaType.create();
+ QCOMPARE(metaType.construct(storage, other), storage);
+ metaType.destruct(storage);
QBENCHMARK {
- QMetaType type(typeId);
for (int i = 0; i < 100000; ++i) {
- type.construct(storage, other);
- type.destruct(storage);
+ metaType.construct(storage, other);
+ metaType.destruct(storage);
}
}
- QMetaType::destroy(typeId, other);
+ metaType.destroy(other);
qFreeAligned(storage);
}
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 9664143608..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,12 +308,12 @@ 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) {
- if (QMetaType::typeName(i)) // QMetaType(27) does not exist
- QTest::newRow(QMetaType::typeName(i)) << i;
+ if (QMetaType metaType(i); metaType.isValid()) // QMetaType(27) does not exist
+ QTest::newRow(metaType.name()) << 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
new file mode 100644
index 0000000000..0a710447a5
--- /dev/null
+++ b/tests/benchmarks/corelib/mimetypes/qmimedatabase/files/N.tar.gz
Binary files differ
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
new file mode 100644
index 0000000000..d1ed8a45d1
--- /dev/null
+++ b/tests/benchmarks/corelib/mimetypes/qmimedatabase/files/z
Binary files differ
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 3e7f520b76..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,41 +73,44 @@ 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 {
QUuid uuid = QUuid::fromRfc4122(string);
+ Q_UNUSED(uuid)
}
}
-void tst_bench_QUuid::createUuidV3()
+void tst_QUuid::createUuidV3()
{
QUuid ns = QUuid::createUuid();
QByteArray name = QByteArray("Test");
QBENCHMARK {
QUuid uuid = QUuid::createUuidV3(ns, name);
+ Q_UNUSED(uuid)
}
}
-void tst_bench_QUuid::createUuidV5()
+void tst_QUuid::createUuidV5()
{
QUuid ns = QUuid::createUuid();
QByteArray name = QByteArray("Test");
QBENCHMARK {
QUuid uuid = QUuid::createUuidV5(ns, name);
+ Q_UNUSED(uuid)
}
}
-void tst_bench_QUuid::toDataStream()
+void tst_QUuid::toDataStream()
{
QUuid uuid = QUuid::createUuid();
QByteArray ar;
@@ -148,7 +122,7 @@ void tst_bench_QUuid::toDataStream()
}
}
-void tst_bench_QUuid::fromDataStream()
+void tst_QUuid::fromDataStream()
{
QUuid uuid1, uuid2;
uuid1 = QUuid::createUuid();
@@ -165,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 f5fc9eff2c..303aa51def 100644
--- a/tests/benchmarks/corelib/text/CMakeLists.txt
+++ b/tests/benchmarks/corelib/text/CMakeLists.txt
@@ -1,11 +1,12 @@
-# Generated from text.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
add_subdirectory(qbytearray)
add_subdirectory(qchar)
add_subdirectory(qlocale)
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/main.cpp
deleted file mode 100644
index 0ddaa33110..0000000000
--- a/tests/benchmarks/corelib/text/qlocale/main.cpp
+++ /dev/null
@@ -1,397 +0,0 @@
-/****************************************************************************
-**
-** 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$
-**
-****************************************************************************/
-
-#include <QLocale>
-#include <QTest>
-
-class tst_QLocale : public QObject
-{
- Q_OBJECT
-
-private Q_SLOTS:
- void fromString_data();
- void fromString();
- void fromTags_data();
- void fromTags();
- void fromLangScript_data();
- void fromLangScript();
- void fromLangLand_data();
- void fromLangLand();
- void fromScriptLand_data();
- void fromScriptLand();
- void fromLang_data();
- void fromLang();
- void fromScript_data();
- void fromScript();
- void fromLand_data();
- void fromLand();
- void toUpper_QLocale_1();
- void toUpper_QLocale_2();
- void toUpper_QString();
- void number_QString();
-};
-
-static QString data()
-{
- return QStringLiteral("/qt-5/qtbase/tests/benchmarks/corelib/tools/qlocale");
-}
-
-// Make individual cycles O(a few) msecs, rather than tiny fractions thereof:
-#define LOOP(s) for (int i = 0; i < 5000; ++i) { s; }
-
-void tst_QLocale::fromString_data()
-{
- QTest::addColumn<QString>("name");
-
- QTest::newRow("C") << QStringLiteral("C");
-#define ROW(name) QTest::newRow(name) << QStringLiteral(name)
- ROW("en-Latn-DE");
- ROW("sd-Deva-IN");
- ROW("az-Cyrl-AZ");
- ROW("az-Latn-AZ");
- ROW("bs-Cyrl-BA");
- ROW("bs-Latn-BA");
- ROW("ff-Latn-LR");
- ROW("ff-Latn-MR");
- ROW("pa-Arab-PK");
- ROW("pa-Guru-IN");
- ROW("shi-Latn-MA");
- ROW("shi-Tfng-MA");
- ROW("sr-Cyrl-BA");
- ROW("sr-Cyrl-RS");
- ROW("sr-Latn-BA");
- ROW("sr-Latn-ME");
- ROW("uz-Arab-AF");
- ROW("uz-Cyrl-UZ");
- ROW("uz-Latn-UZ");
- ROW("vai-Latn-LR");
- ROW("vai-Vaii-LR");
- ROW("yue-Hans-CN");
- ROW("yue-Hant-HK");
- ROW("zh-Hans-CN");
- ROW("zh-Hans-HK");
- ROW("zh-Hans-SG");
- ROW("zh-Hant-HK");
- ROW("zh-Hant-TW");
-#undef ROW
-}
-
-void tst_QLocale::fromString()
-{
- QFETCH(const QString, name);
- QBENCHMARK { LOOP(QLocale loc(name)) }
-}
-
-void tst_QLocale::fromTags_data()
-{
- QTest::addColumn<QLocale::Language>("language");
- QTest::addColumn<QLocale::Script>("script");
- QTest::addColumn<QLocale::Country>("territory");
-
-#define ROW(name, lang, text, land) \
- QTest::newRow(name) << QLocale::lang << QLocale::text << QLocale::land
- ROW("C", C, AnyScript, AnyCountry);
- ROW("en-Latn-DE", English, LatinScript, Germany);
- ROW("sd-Deva-IN", Sindhi, DevanagariScript, India);
- ROW("az-Cyrl-AZ", Azerbaijani, CyrillicScript, Azerbaijan);
- ROW("az-Latn-AZ", Azerbaijani, LatinScript, Azerbaijan);
- ROW("bs-Cyrl-BA", Bosnian, CyrillicScript, BosniaAndHerzegowina);
- ROW("bs-Latn-BA", Bosnian, LatinScript, BosniaAndHerzegowina);
- ROW("ff-Latn-LR", Fulah, LatinScript, Liberia);
- ROW("ff-Latn-MR", Fulah, LatinScript, Mauritania);
- ROW("pa-Arab-PK", Punjabi, ArabicScript, Pakistan);
- ROW("pa-Guru-IN", Punjabi, GurmukhiScript, India);
- ROW("shi-Latn-MA", Tachelhit, LatinScript, Morocco);
- ROW("shi-Tfng-MA", Tachelhit, TifinaghScript, Morocco);
- ROW("sr-Cyrl-BA", Serbian, CyrillicScript, BosniaAndHerzegowina);
- ROW("sr-Cyrl-RS", Serbian, CyrillicScript, Serbia);
- ROW("sr-Latn-BA", Serbian, LatinScript, BosniaAndHerzegowina);
- ROW("sr-Latn-ME", Serbian, LatinScript, Montenegro);
- ROW("uz-Arab-AF", Uzbek, ArabicScript, Afghanistan);
- ROW("uz-Cyrl-UZ", Uzbek, CyrillicScript, Uzbekistan);
- ROW("uz-Latn-UZ", Uzbek, LatinScript, Uzbekistan);
- ROW("vai-Latn-LR", Vai, LatinScript, Liberia);
- ROW("vai-Vaii-LR", Vai, VaiScript, Liberia);
- ROW("yue-Hans-CN", Cantonese, SimplifiedHanScript, China);
- ROW("yue-Hant-HK", Cantonese, TraditionalHanScript, HongKong);
- ROW("zh-Hans-CN", Chinese, SimplifiedHanScript, China);
- ROW("zh-Hans-HK", Chinese, SimplifiedHanScript, HongKong);
- ROW("zh-Hans-SG", Chinese, SimplifiedHanScript, Singapore);
- ROW("zh-Hant-HK", Chinese, TraditionalHanScript, HongKong);
- ROW("zh-Hant-TW", Chinese, TraditionalHanScript, Taiwan);
-#undef ROW
-}
-
-void tst_QLocale::fromTags()
-{
- QFETCH(const QLocale::Language, language);
- QFETCH(const QLocale::Script, script);
- QFETCH(const QLocale::Country, territory);
- QBENCHMARK { LOOP(QLocale loc(language, script, territory)) }
-}
-
-void tst_QLocale::fromLangScript_data()
-{
- QTest::addColumn<QLocale::Language>("language");
- QTest::addColumn<QLocale::Script>("script");
-
-#define ROW(name, lang, text) \
- QTest::newRow(name) << QLocale::lang << QLocale::text
- ROW("C", C, AnyScript);
- ROW("en-Latn", English, LatinScript);
- ROW("sd-Deva", Sindhi, DevanagariScript);
- ROW("az-Cyrl", Azerbaijani, CyrillicScript);
- ROW("az-Latn", Azerbaijani, LatinScript);
- ROW("bs-Cyrl", Bosnian, CyrillicScript);
- ROW("bs-Latn", Bosnian, LatinScript);
- ROW("ff-Latn", Fulah, LatinScript);
- ROW("pa-Arab", Punjabi, ArabicScript);
- ROW("pa-Guru", Punjabi, GurmukhiScript);
- ROW("shi-Latn", Tachelhit, LatinScript);
- ROW("shi-Tfng", Tachelhit, TifinaghScript);
- ROW("sr-Cyrl", Serbian, CyrillicScript);
- ROW("sr-Latn", Serbian, LatinScript);
- ROW("uz-Arab", Uzbek, ArabicScript);
- ROW("uz-Cyrl", Uzbek, CyrillicScript);
- ROW("uz-Latn", Uzbek, LatinScript);
- ROW("vai-Latn", Vai, LatinScript);
- ROW("vai-Vaii", Vai, VaiScript);
- ROW("yue-Hans", Cantonese, SimplifiedHanScript);
- ROW("yue-Hant", Cantonese, TraditionalHanScript);
- ROW("zh-Hans", Chinese, SimplifiedHanScript);
- ROW("zh-Hant", Chinese, TraditionalHanScript);
-#undef ROW
-}
-
-void tst_QLocale::fromLangScript()
-{
- QFETCH(const QLocale::Language, language);
- QFETCH(const QLocale::Script, script);
- QBENCHMARK { LOOP(QLocale loc(language, script, QLocale::AnyCountry)) }
-}
-
-void tst_QLocale::fromLangLand_data()
-{
- QTest::addColumn<QLocale::Language>("language");
- QTest::addColumn<QLocale::Country>("territory");
-
-#define ROW(name, lang, land) \
- QTest::newRow(name) << QLocale::lang << QLocale::land
- ROW("C", C, AnyCountry);
- ROW("en-DE", English, Germany);
- ROW("sd-IN", Sindhi, India);
- ROW("az-AZ", Azerbaijani, Azerbaijan);
- ROW("bs-BA", Bosnian, BosniaAndHerzegowina);
- ROW("ff-LR", Fulah, Liberia);
- ROW("ff-MR", Fulah, Mauritania);
- ROW("pa-PK", Punjabi, Pakistan);
- ROW("pa-IN", Punjabi, India);
- ROW("shi-MA", Tachelhit, Morocco);
- ROW("sr-BA", Serbian, BosniaAndHerzegowina);
- ROW("sr-RS", Serbian, Serbia);
- ROW("sr-ME", Serbian, Montenegro);
- ROW("uz-AF", Uzbek, Afghanistan);
- ROW("uz-UZ", Uzbek, Uzbekistan);
- ROW("vai-LR", Vai, Liberia);
- ROW("yue-CN", Cantonese, China);
- ROW("yue-HK", Cantonese, HongKong);
- ROW("zh-CN", Chinese, China);
- ROW("zh-HK", Chinese, HongKong);
- ROW("zh-SG", Chinese, Singapore);
- ROW("zh-TW", Chinese, Taiwan);
-#undef ROW
-}
-
-void tst_QLocale::fromLangLand()
-{
- QFETCH(const QLocale::Language, language);
- QFETCH(const QLocale::Country, territory);
- QBENCHMARK { LOOP(QLocale loc(language, territory)) }
-}
-
-void tst_QLocale::fromScriptLand_data()
-{
- QTest::addColumn<QLocale::Script>("script");
- QTest::addColumn<QLocale::Country>("territory");
-
-#define ROW(name, text, land) \
- QTest::newRow(name) << QLocale::text << QLocale::land
- ROW("Any", AnyScript, AnyCountry);
- ROW("Latn-DE", LatinScript, Germany);
- ROW("Deva-IN", DevanagariScript, India);
- ROW("Cyrl-AZ", CyrillicScript, Azerbaijan);
- ROW("Latn-AZ", LatinScript, Azerbaijan);
- ROW("Cyrl-BA", CyrillicScript, BosniaAndHerzegowina);
- ROW("Latn-BA", LatinScript, BosniaAndHerzegowina);
- ROW("Latn-LR", LatinScript, Liberia);
- ROW("Latn-MR", LatinScript, Mauritania);
- ROW("Arab-PK", ArabicScript, Pakistan);
- ROW("Guru-IN", GurmukhiScript, India);
- ROW("Latn-MA", LatinScript, Morocco);
- ROW("Tfng-MA", TifinaghScript, Morocco);
- ROW("Cyrl-BA", CyrillicScript, BosniaAndHerzegowina);
- ROW("Cyrl-RS", CyrillicScript, Serbia);
- ROW("Latn-BA", LatinScript, BosniaAndHerzegowina);
- ROW("Latn-ME", LatinScript, Montenegro);
- ROW("Arab-AF", ArabicScript, Afghanistan);
- ROW("Cyrl-UZ", CyrillicScript, Uzbekistan);
- ROW("Latn-UZ", LatinScript, Uzbekistan);
- ROW("Latn-LR", LatinScript, Liberia);
- ROW("Vaii-LR", VaiScript, Liberia);
- ROW("Hans-CN", SimplifiedHanScript, China);
- ROW("Hant-HK", TraditionalHanScript, HongKong);
- ROW("Hans-CN", SimplifiedHanScript, China);
- ROW("Hans-HK", SimplifiedHanScript, HongKong);
- ROW("Hans-SG", SimplifiedHanScript, Singapore);
- ROW("Hant-HK", TraditionalHanScript, HongKong);
- ROW("Hant-TW", TraditionalHanScript, Taiwan);
-#undef ROW
-}
-
-void tst_QLocale::fromScriptLand()
-{
- QFETCH(const QLocale::Script, script);
- QFETCH(const QLocale::Country, territory);
- QBENCHMARK { LOOP(QLocale loc(QLocale::AnyLanguage, script, territory)) }
-}
-
-void tst_QLocale::fromLang_data()
-{
- QTest::addColumn<QLocale::Language>("language");
-
-#define ROW(name, lang) \
- QTest::newRow(name) << QLocale::lang
- ROW("C", C);
- ROW("en", English);
- ROW("sd", Sindhi);
- ROW("az", Azerbaijani);
- ROW("bs", Bosnian);
- ROW("ff", Fulah);
- ROW("pa", Punjabi);
- ROW("shi", Tachelhit);
- ROW("sr", Serbian);
- ROW("uz", Uzbek);
- ROW("vai", Vai);
- ROW("yue", Cantonese);
- ROW("zh", Chinese);
-#undef ROW
-}
-
-void tst_QLocale::fromLang()
-{
- QFETCH(const QLocale::Language, language);
- QBENCHMARK { LOOP(QLocale loc(language)) }
-}
-
-void tst_QLocale::fromScript_data()
-{
- QTest::addColumn<QLocale::Script>("script");
-
-#define ROW(name, text) \
- QTest::newRow(name) << QLocale::text
- ROW("Any", AnyScript);
- ROW("Latn", LatinScript);
- ROW("Deva", DevanagariScript);
- ROW("Cyrl", CyrillicScript);
- ROW("Arab", ArabicScript);
- ROW("Guru", GurmukhiScript);
- ROW("Tfng", TifinaghScript);
- ROW("Vaii", VaiScript);
- ROW("Hans", SimplifiedHanScript);
- ROW("Hant", TraditionalHanScript);
-#undef ROW
-}
-
-void tst_QLocale::fromScript()
-{
- QFETCH(const QLocale::Script, script);
- QBENCHMARK { LOOP(QLocale loc(QLocale::AnyLanguage, script, QLocale::AnyCountry)) }
-}
-
-void tst_QLocale::fromLand_data()
-{
- QTest::addColumn<QLocale::Country>("territory");
-
-#define ROW(name, land) \
- QTest::newRow(name) << QLocale::land
- ROW("Any", AnyCountry);
- ROW("DE", Germany);
- ROW("IN", India);
- ROW("AZ", Azerbaijan);
- ROW("BA", BosniaAndHerzegowina);
- ROW("LR", Liberia);
- ROW("MR", Mauritania);
- ROW("PK", Pakistan);
- ROW("MA", Morocco);
- ROW("RS", Serbia);
- ROW("ME", Montenegro);
- ROW("AF", Afghanistan);
- ROW("UZ", Uzbekistan);
- ROW("CN", China);
- ROW("HK", HongKong);
- ROW("SG", Singapore);
- ROW("TW", Taiwan);
-#undef ROW
-}
-
-void tst_QLocale::fromLand()
-{
- QFETCH(const QLocale::Country, territory);
- QBENCHMARK { LOOP(QLocale loc(QLocale::AnyLanguage, territory)) }
-}
-
-void tst_QLocale::toUpper_QLocale_1()
-{
- QString s = data();
- QBENCHMARK { LOOP(QString t(QLocale().toUpper(s))) }
-}
-
-void tst_QLocale::toUpper_QLocale_2()
-{
- QString s = data();
- QLocale l;
- QBENCHMARK { LOOP(QString t(l.toUpper(s))) }
-}
-
-void tst_QLocale::toUpper_QString()
-{
- QString s = data();
- QBENCHMARK { LOOP(QString t(s.toUpper())) }
-}
-
-void tst_QLocale::number_QString()
-{
- QString s;
- QBENCHMARK {
- s = QString::number(12345678);
- }
-}
-
-QTEST_MAIN(tst_QLocale)
-
-#include "main.moc"
diff --git a/tests/benchmarks/corelib/text/qlocale/tst_bench_qlocale.cpp b/tests/benchmarks/corelib/text/qlocale/tst_bench_qlocale.cpp
new file mode 100644
index 0000000000..3d13174c9c
--- /dev/null
+++ b/tests/benchmarks/corelib/text/qlocale/tst_bench_qlocale.cpp
@@ -0,0 +1,593 @@
+// 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
+
+private Q_SLOTS:
+ void fromString_data();
+ void fromString();
+ void fromTags_data();
+ void fromTags();
+ void fromLangScript_data();
+ void fromLangScript();
+ void fromLangLand_data();
+ void fromLangLand();
+ void fromScriptLand_data();
+ void fromScriptLand();
+ void fromLang_data();
+ void fromLang();
+ void fromScript_data();
+ void fromScript();
+ void fromLand_data();
+ void fromLand();
+ void toUpper_QLocale_1();
+ 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()
+{
+ return QStringLiteral("/qt-5/qtbase/tests/benchmarks/corelib/tools/qlocale");
+}
+
+// Make individual cycles O(a few) msecs, rather than tiny fractions thereof:
+#define LOOP(s) for (int i = 0; i < 5000; ++i) { s; }
+
+void tst_QLocale::fromString_data()
+{
+ QTest::addColumn<QString>("name");
+
+ QTest::newRow("C") << QStringLiteral("C");
+#define ROW(name) QTest::newRow(name) << QStringLiteral(name)
+ ROW("en-Latn-DE");
+ ROW("sd-Deva-IN");
+ ROW("az-Cyrl-AZ");
+ ROW("az-Latn-AZ");
+ ROW("bs-Cyrl-BA");
+ ROW("bs-Latn-BA");
+ ROW("ff-Latn-LR");
+ ROW("ff-Latn-MR");
+ ROW("pa-Arab-PK");
+ ROW("pa-Guru-IN");
+ ROW("shi-Latn-MA");
+ ROW("shi-Tfng-MA");
+ ROW("sr-Cyrl-BA");
+ ROW("sr-Cyrl-RS");
+ ROW("sr-Latn-BA");
+ ROW("sr-Latn-ME");
+ ROW("uz-Arab-AF");
+ ROW("uz-Cyrl-UZ");
+ ROW("uz-Latn-UZ");
+ ROW("vai-Latn-LR");
+ ROW("vai-Vaii-LR");
+ ROW("yue-Hans-CN");
+ ROW("yue-Hant-HK");
+ ROW("zh-Hans-CN");
+ ROW("zh-Hans-HK");
+ ROW("zh-Hans-SG");
+ ROW("zh-Hant-HK");
+ ROW("zh-Hant-TW");
+#undef ROW
+}
+
+void tst_QLocale::fromString()
+{
+ QFETCH(const QString, name);
+ QBENCHMARK { LOOP(QLocale loc(name)) }
+}
+
+void tst_QLocale::fromTags_data()
+{
+ QTest::addColumn<QLocale::Language>("language");
+ QTest::addColumn<QLocale::Script>("script");
+ QTest::addColumn<QLocale::Territory>("territory");
+
+#define ROW(name, lang, text, land) \
+ QTest::newRow(name) << QLocale::lang << QLocale::text << QLocale::land
+ ROW("C", C, AnyScript, AnyTerritory);
+ ROW("en-Latn-DE", English, LatinScript, Germany);
+ ROW("sd-Deva-IN", Sindhi, DevanagariScript, India);
+ ROW("az-Cyrl-AZ", Azerbaijani, CyrillicScript, Azerbaijan);
+ ROW("az-Latn-AZ", Azerbaijani, LatinScript, Azerbaijan);
+ ROW("bs-Cyrl-BA", Bosnian, CyrillicScript, BosniaAndHerzegowina);
+ ROW("bs-Latn-BA", Bosnian, LatinScript, BosniaAndHerzegowina);
+ ROW("ff-Latn-LR", Fulah, LatinScript, Liberia);
+ ROW("ff-Latn-MR", Fulah, LatinScript, Mauritania);
+ ROW("pa-Arab-PK", Punjabi, ArabicScript, Pakistan);
+ ROW("pa-Guru-IN", Punjabi, GurmukhiScript, India);
+ ROW("shi-Latn-MA", Tachelhit, LatinScript, Morocco);
+ ROW("shi-Tfng-MA", Tachelhit, TifinaghScript, Morocco);
+ ROW("sr-Cyrl-BA", Serbian, CyrillicScript, BosniaAndHerzegowina);
+ ROW("sr-Cyrl-RS", Serbian, CyrillicScript, Serbia);
+ ROW("sr-Latn-BA", Serbian, LatinScript, BosniaAndHerzegowina);
+ ROW("sr-Latn-ME", Serbian, LatinScript, Montenegro);
+ ROW("uz-Arab-AF", Uzbek, ArabicScript, Afghanistan);
+ ROW("uz-Cyrl-UZ", Uzbek, CyrillicScript, Uzbekistan);
+ ROW("uz-Latn-UZ", Uzbek, LatinScript, Uzbekistan);
+ ROW("vai-Latn-LR", Vai, LatinScript, Liberia);
+ ROW("vai-Vaii-LR", Vai, VaiScript, Liberia);
+ ROW("yue-Hans-CN", Cantonese, SimplifiedHanScript, China);
+ ROW("yue-Hant-HK", Cantonese, TraditionalHanScript, HongKong);
+ ROW("zh-Hans-CN", Chinese, SimplifiedHanScript, China);
+ ROW("zh-Hans-HK", Chinese, SimplifiedHanScript, HongKong);
+ ROW("zh-Hans-SG", Chinese, SimplifiedHanScript, Singapore);
+ ROW("zh-Hant-HK", Chinese, TraditionalHanScript, HongKong);
+ ROW("zh-Hant-TW", Chinese, TraditionalHanScript, Taiwan);
+#undef ROW
+}
+
+void tst_QLocale::fromTags()
+{
+ QFETCH(const QLocale::Language, language);
+ QFETCH(const QLocale::Script, script);
+ QFETCH(const QLocale::Territory, territory);
+ QBENCHMARK { LOOP(QLocale loc(language, script, territory)) }
+}
+
+void tst_QLocale::fromLangScript_data()
+{
+ QTest::addColumn<QLocale::Language>("language");
+ QTest::addColumn<QLocale::Script>("script");
+
+#define ROW(name, lang, text) \
+ QTest::newRow(name) << QLocale::lang << QLocale::text
+ ROW("C", C, AnyScript);
+ ROW("en-Latn", English, LatinScript);
+ ROW("sd-Deva", Sindhi, DevanagariScript);
+ ROW("az-Cyrl", Azerbaijani, CyrillicScript);
+ ROW("az-Latn", Azerbaijani, LatinScript);
+ ROW("bs-Cyrl", Bosnian, CyrillicScript);
+ ROW("bs-Latn", Bosnian, LatinScript);
+ ROW("ff-Latn", Fulah, LatinScript);
+ ROW("pa-Arab", Punjabi, ArabicScript);
+ ROW("pa-Guru", Punjabi, GurmukhiScript);
+ ROW("shi-Latn", Tachelhit, LatinScript);
+ ROW("shi-Tfng", Tachelhit, TifinaghScript);
+ ROW("sr-Cyrl", Serbian, CyrillicScript);
+ ROW("sr-Latn", Serbian, LatinScript);
+ ROW("uz-Arab", Uzbek, ArabicScript);
+ ROW("uz-Cyrl", Uzbek, CyrillicScript);
+ ROW("uz-Latn", Uzbek, LatinScript);
+ ROW("vai-Latn", Vai, LatinScript);
+ ROW("vai-Vaii", Vai, VaiScript);
+ ROW("yue-Hans", Cantonese, SimplifiedHanScript);
+ ROW("yue-Hant", Cantonese, TraditionalHanScript);
+ ROW("zh-Hans", Chinese, SimplifiedHanScript);
+ ROW("zh-Hant", Chinese, TraditionalHanScript);
+#undef ROW
+}
+
+void tst_QLocale::fromLangScript()
+{
+ QFETCH(const QLocale::Language, language);
+ QFETCH(const QLocale::Script, script);
+ QBENCHMARK { LOOP(QLocale loc(language, script, QLocale::AnyTerritory)) }
+}
+
+void tst_QLocale::fromLangLand_data()
+{
+ QTest::addColumn<QLocale::Language>("language");
+ QTest::addColumn<QLocale::Territory>("territory");
+
+#define ROW(name, lang, land) \
+ QTest::newRow(name) << QLocale::lang << QLocale::land
+ ROW("C", C, AnyTerritory);
+ ROW("en-DE", English, Germany);
+ ROW("sd-IN", Sindhi, India);
+ ROW("az-AZ", Azerbaijani, Azerbaijan);
+ ROW("bs-BA", Bosnian, BosniaAndHerzegowina);
+ ROW("ff-LR", Fulah, Liberia);
+ ROW("ff-MR", Fulah, Mauritania);
+ ROW("pa-PK", Punjabi, Pakistan);
+ ROW("pa-IN", Punjabi, India);
+ ROW("shi-MA", Tachelhit, Morocco);
+ ROW("sr-BA", Serbian, BosniaAndHerzegowina);
+ ROW("sr-RS", Serbian, Serbia);
+ ROW("sr-ME", Serbian, Montenegro);
+ ROW("uz-AF", Uzbek, Afghanistan);
+ ROW("uz-UZ", Uzbek, Uzbekistan);
+ ROW("vai-LR", Vai, Liberia);
+ ROW("yue-CN", Cantonese, China);
+ ROW("yue-HK", Cantonese, HongKong);
+ ROW("zh-CN", Chinese, China);
+ ROW("zh-HK", Chinese, HongKong);
+ ROW("zh-SG", Chinese, Singapore);
+ ROW("zh-TW", Chinese, Taiwan);
+#undef ROW
+}
+
+void tst_QLocale::fromLangLand()
+{
+ QFETCH(const QLocale::Language, language);
+ QFETCH(const QLocale::Territory, territory);
+ QBENCHMARK { LOOP(QLocale loc(language, territory)) }
+}
+
+void tst_QLocale::fromScriptLand_data()
+{
+ QTest::addColumn<QLocale::Script>("script");
+ QTest::addColumn<QLocale::Territory>("territory");
+
+#define ROW(name, text, land) \
+ QTest::newRow(name) << QLocale::text << QLocale::land
+ ROW("Any", AnyScript, AnyTerritory);
+ ROW("Latn-DE", LatinScript, Germany);
+ ROW("Deva-IN", DevanagariScript, India);
+ ROW("Cyrl-AZ", CyrillicScript, Azerbaijan);
+ ROW("Latn-AZ", LatinScript, Azerbaijan);
+ ROW("Cyrl-BA", CyrillicScript, BosniaAndHerzegowina);
+ ROW("Latn-BA", LatinScript, BosniaAndHerzegowina);
+ ROW("Latn-LR", LatinScript, Liberia);
+ ROW("Latn-MR", LatinScript, Mauritania);
+ ROW("Arab-PK", ArabicScript, Pakistan);
+ ROW("Guru-IN", GurmukhiScript, India);
+ ROW("Latn-MA", LatinScript, Morocco);
+ ROW("Tfng-MA", TifinaghScript, Morocco);
+ ROW("Cyrl-BA", CyrillicScript, BosniaAndHerzegowina);
+ ROW("Cyrl-RS", CyrillicScript, Serbia);
+ ROW("Latn-BA", LatinScript, BosniaAndHerzegowina);
+ ROW("Latn-ME", LatinScript, Montenegro);
+ ROW("Arab-AF", ArabicScript, Afghanistan);
+ ROW("Cyrl-UZ", CyrillicScript, Uzbekistan);
+ ROW("Latn-UZ", LatinScript, Uzbekistan);
+ ROW("Latn-LR", LatinScript, Liberia);
+ ROW("Vaii-LR", VaiScript, Liberia);
+ ROW("Hans-CN", SimplifiedHanScript, China);
+ ROW("Hant-HK", TraditionalHanScript, HongKong);
+ ROW("Hans-CN", SimplifiedHanScript, China);
+ ROW("Hans-HK", SimplifiedHanScript, HongKong);
+ ROW("Hans-SG", SimplifiedHanScript, Singapore);
+ ROW("Hant-HK", TraditionalHanScript, HongKong);
+ ROW("Hant-TW", TraditionalHanScript, Taiwan);
+#undef ROW
+}
+
+void tst_QLocale::fromScriptLand()
+{
+ QFETCH(const QLocale::Script, script);
+ QFETCH(const QLocale::Territory, territory);
+ QBENCHMARK { LOOP(QLocale loc(QLocale::AnyLanguage, script, territory)) }
+}
+
+void tst_QLocale::fromLang_data()
+{
+ QTest::addColumn<QLocale::Language>("language");
+
+#define ROW(name, lang) \
+ QTest::newRow(name) << QLocale::lang
+ ROW("C", C);
+ ROW("en", English);
+ ROW("sd", Sindhi);
+ ROW("az", Azerbaijani);
+ ROW("bs", Bosnian);
+ ROW("ff", Fulah);
+ ROW("pa", Punjabi);
+ ROW("shi", Tachelhit);
+ ROW("sr", Serbian);
+ ROW("uz", Uzbek);
+ ROW("vai", Vai);
+ ROW("yue", Cantonese);
+ ROW("zh", Chinese);
+#undef ROW
+}
+
+void tst_QLocale::fromLang()
+{
+ QFETCH(const QLocale::Language, language);
+ QBENCHMARK { LOOP(QLocale loc(language)) }
+}
+
+void tst_QLocale::fromScript_data()
+{
+ QTest::addColumn<QLocale::Script>("script");
+
+#define ROW(name, text) \
+ QTest::newRow(name) << QLocale::text
+ ROW("Any", AnyScript);
+ ROW("Latn", LatinScript);
+ ROW("Deva", DevanagariScript);
+ ROW("Cyrl", CyrillicScript);
+ ROW("Arab", ArabicScript);
+ ROW("Guru", GurmukhiScript);
+ ROW("Tfng", TifinaghScript);
+ ROW("Vaii", VaiScript);
+ ROW("Hans", SimplifiedHanScript);
+ ROW("Hant", TraditionalHanScript);
+#undef ROW
+}
+
+void tst_QLocale::fromScript()
+{
+ QFETCH(const QLocale::Script, script);
+ QBENCHMARK { LOOP(QLocale loc(QLocale::AnyLanguage, script, QLocale::AnyTerritory)) }
+}
+
+void tst_QLocale::fromLand_data()
+{
+ QTest::addColumn<QLocale::Territory>("territory");
+
+#define ROW(name, land) \
+ QTest::newRow(name) << QLocale::land
+ ROW("Any", AnyTerritory);
+ ROW("DE", Germany);
+ ROW("IN", India);
+ ROW("AZ", Azerbaijan);
+ ROW("BA", BosniaAndHerzegowina);
+ ROW("LR", Liberia);
+ ROW("MR", Mauritania);
+ ROW("PK", Pakistan);
+ ROW("MA", Morocco);
+ ROW("RS", Serbia);
+ ROW("ME", Montenegro);
+ ROW("AF", Afghanistan);
+ ROW("UZ", Uzbekistan);
+ ROW("CN", China);
+ ROW("HK", HongKong);
+ ROW("SG", Singapore);
+ ROW("TW", Taiwan);
+#undef ROW
+}
+
+void tst_QLocale::fromLand()
+{
+ QFETCH(const QLocale::Territory, territory);
+ QBENCHMARK { LOOP(QLocale loc(QLocale::AnyLanguage, territory)) }
+}
+
+void tst_QLocale::toUpper_QLocale_1()
+{
+ QString s = data();
+ QBENCHMARK { LOOP(QString t(QLocale().toUpper(s))) }
+}
+
+void tst_QLocale::toUpper_QLocale_2()
+{
+ QString s = data();
+ QLocale l;
+ QBENCHMARK { LOOP(QString t(l.toUpper(s))) }
+}
+
+void tst_QLocale::toUpper_QString()
+{
+ QString s = data();
+ QBENCHMARK { LOOP(QString t(s.toUpper())) }
+}
+
+void tst_QLocale::number_QString()
+{
+ QString s;
+ QBENCHMARK {
+ s = QString::number(12345678);
+ }
+}
+
+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: &minus;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&minus;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: &infin;") << 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: &infin;", "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 "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
new file mode 100644
index 0000000000..11720e5204
--- /dev/null
+++ b/tests/benchmarks/corelib/text/qstringtokenizer/CMakeLists.txt
@@ -0,0 +1,20 @@
+# 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
+ tst_bench_qstringtokenizer.cpp
+ LIBRARIES
+ Qt::Test
+)
+
+qt_add_resources(tst_bench_qstringtokenizer "qstringtokenizer_bench_data"
+ PREFIX
+ "/"
+ FILES
+ "./data/lorem.txt"
+)
diff --git a/tests/benchmarks/corelib/text/qstringtokenizer/data/lorem.txt b/tests/benchmarks/corelib/text/qstringtokenizer/data/lorem.txt
new file mode 100644
index 0000000000..ec40b0c8c8
--- /dev/null
+++ b/tests/benchmarks/corelib/text/qstringtokenizer/data/lorem.txt
@@ -0,0 +1,40 @@
+Lorem ipsum dolor sit amet. Ad adipisci quos qui repellat tempore ut dolor vero eos odit soluta ut facere repellendus aut eius voluptatibus. Eos maiores nihil quo deleniti sequi ut iure dolores aut enim molestiae. Non dicta maxime aut quia temporibus ad temporibus repellat? Qui minus nemo eum reiciendis harum ut incidunt praesentium id voluptatum dolorem et enim voluptas eos iste quasi sunt mollitia. Cum fugiat totam 33 quisquam aut autem nobis et illum laborum? Et ipsam libero et harum quas id dolores officia eos nulla asperiores cum similique necessitatibus in dolores reiciendis. Ex consequatur voluptate non alias sunt est voluptatem inventore. Ab odit pariatur non possimus molestiae et dolorum reiciendis et esse nihil qui numquam fugit aut asperiores rerum sed dolorum delectus. Eos temporibus recusandae sed illum quasi in inventore dolorum. Et impedit odio aut accusamus possimus eos quia voluptatem vel fugiat corrupti cum error harum ducimus illum vel soluta porro. Et natus voluptas aut voluptas veniam non ipsa libero est necessitatibus sint ut omnis tempora id distinctio amet sit velit sunt.
+
+Aut nostrum vero in natus officiis sed explicabo iusto ad odit ipsam qui modi veritatis. A eligendi fugiat sunt eaque qui veniam molestiae! Et minima facere aut galisum quisquam sed repudiandae nulla! Sed perspiciatis galisum eum consectetur tempora sed perspiciatis pariatur ea veritatis iste ea dolore laborum non numquam velit. Et consectetur voluptas id quia sint est animi impedit sed adipisci consequuntur ut fugiat reiciendis. Sit beatae porro qui assumenda ipsum sit galisum mollitia est nulla suscipit ut omnis voluptates qui aperiam impedit eum quae consequuntur. Non facere delectus ut voluptatum voluptatibus nihil vero et fugiat fugiat qui perferendis doloribus ab quia nihil rem iusto distinctio. Ex explicabo debitis non necessitatibus facilis aut debitis laudantium sit rerum explicabo est consequatur internos aut asperiores aliquid est tenetur voluptatibus. Sit quis quas non placeat exercitationem est aperiam tenetur sed sunt accusamus eum delectus quis est animi galisum. Sed molestiae nisi ea voluptatem quasi id voluptatem sunt sit vitae dolor eos nihil galisum eos deleniti rerum! Sed laudantium fuga et ipsam galisum sed temporibus delectus et optio aliquid ut reprehenderit voluptatem?
+
+Ut molestiae delectus sed distinctio vero ut assumenda rerum 33 dignissimos illo. Ut pariatur unde qui cumque quis quo tenetur odio cum vitae quisquam aut consequuntur velit aut vitae rerum. Qui dignissimos voluptate sit nihil iusto sed eius laudantium et enim voluptatibus non adipisci vero aut corporis natus eum dolorum rerum. Non molestias rerum hic maiores dolor qui veniam optio est itaque blanditiis et quis distinctio qui maxime accusamus. Eos voluptate facilis et fugiat rerum et quos molestiae non tempore nemo. Est dolores porro aut molestias impedit et sunt facilis ad quam dignissimos aut dolores maiores sit perspiciatis cupiditate et molestias deserunt. Qui facilis optio aut facere voluptatum sed asperiores cumque sit dolores maxime qui voluptate sint qui accusantium quasi eos quae fugit! Aut eveniet voluptas vel galisum galisum ea velit doloremque At delectus similique sed corporis soluta ea quia pariatur. Qui earum cupiditate et voluptates magni ut corporis nemo vel totam laboriosam sit quis nulla quo maxime sint. Et nulla blanditiis id fugit enim et nihil commodi a minus consequuntur sed dolores tempore qui possimus libero ea rerum beatae. Qui inventore velit et odit eius et tenetur amet est necessitatibus sequi.
+
+Est soluta distinctio rem galisum dolore quo reprehenderit non nisi similique? Aut nisi soluta vel galisum modi in quisquam aliquam sit corrupti eligendi a aliquam ducimus? In molestiae culpa et placeat dignissimos ut laudantium accusamus eum error facilis aut obcaecati consequatur est sunt placeat ex esse facilis. Sit magnam consequatur labore praesentium eum galisum ratione eum unde totam est quaerat architecto et voluptatem dolorem. Qui nesciunt ratione eum perspiciatis doloremque et quia voluptatem ea nesciunt atque et ratione aperiam in assumenda voluptate sit ipsam facilis. Est vero aliquid ut voluptatem fuga vel deserunt nihil ut excepturi asperiores id voluptates praesentium eum pariatur laudantium vel nobis sequi? At eligendi explicabo aut minus consequatur a fuga sequi et dolorum galisum ad debitis culpa non similique libero. Et modi architecto At soluta itaque ut inventore facere At omnis asperiores ab distinctio vero qui harum iure.
+
+Non quos asperiores aut facilis impedit aut reiciendis possimus et dolorem possimus et facere laudantium. Eos recusandae blanditiis sunt obcaecati ut reprehenderit doloremque qui quidem debitis. Et veritatis sequi sit ducimus pariatur et sint galisum qui dolor dolorem. Et beatae possimus qui ducimus sint sit adipisci quisquam. Ad nostrum expedita sed quia fugit est consequatur quia et maiores dolorum eum quod praesentium. Aut similique beatae delectus architecto et commodi minima qui laudantium ducimus. Qui deleniti Quis ea mollitia vero sit tempore dolores. Et corrupti omnis hic aperiam ducimus et laboriosam eius aut voluptatum sint ut molestiae voluptas et vitae eaque sed harum animi! Quo assumenda eveniet id temporibus sapiente quo vitae accusamus non libero vero ea velit libero sed neque voluptas sed quas nemo. Et voluptas corrupti in sequi cum repudiandae illum est animi omnis non sint laudantium aut earum Quis. Non quia veniam ut voluptatem quam qui quisquam distinctio qui eveniet explicabo sit vitae praesentium est aliquid porro eum quod quam. Est nihil debitis non rerum dolores et error minus. Ut harum perferendis et quam molestiae cum rerum consequatur. Qui nemo quod cum quas accusamus sed quasi sunt.
+
+Non nihil vitae At sapiente aliquam qui quas consectetur eum magnam perferendis ut consequatur quam et iste repellendus. Et quam eligendi ut voluptatem dolorum ut consectetur deserunt et nemo sed autem porro non harum consequatur aut doloremque molestias. Sit minima possimus aut debitis expedita eum consequatur nihil eos voluptas eius. Vel dolor laudantium sed quibusdam provident est sequi omnis quo incidunt assumenda ut modi assumenda qui consequatur doloribus aut cumque aliquid. Ad quia consequatur eos distinctio accusamus ut atque dolor non consectetur rerum qui voluptates quas qui odit velit. Est earum minus non pariatur quo internos rerum et doloremque aperiam et doloribus laudantium aut voluptas molestiae. Ea iste voluptatibus eum voluptatum dolores sit voluptatem dolore et quis nisi. Est maxime animi est magnam distinctio aut quis illo est voluptas itaque ex rerum harum rem dolorum atque?
+
+Et reprehenderit dicta sed dolorum assumenda est exercitationem provident id quas accusantium aut nobis libero. Aut consequatur minima sit veniam explicabo hic voluptas eveniet et vitae eaque. Vel adipisci dolores qui quas molestias vel dolor quasi ea odit quod ea officiis molestiae id fuga quis! Et laboriosam deleniti eum nulla aliquid ut enim fugiat et accusamus quaerat. Quo nostrum possimus qui animi temporibus et ipsam doloremque non totam voluptas! Eos nisi odit aut voluptatum itaque et nulla blanditiis est esse magni ut doloribus Quis. In culpa illum ad provident dolores aut nihil inventore aut consequatur vitae. In fugiat beatae qui quod corrupti quo itaque animi sit suscipit autem. Non nobis nisi et quia magnam qui modi ipsa et velit facere. Aut quia consequatur 33 magnam Quis aut molestiae earum. Ea autem obcaecati et voluptatum nulla qui distinctio iste in voluptatem expedita aut quasi omnis. Et distinctio fugit est voluptate maiores et consequatur neque et repellendus deleniti qui incidunt laudantium et autem quam et blanditiis eveniet. Cum iste consequatur vel voluptates reprehenderit et necessitatibus natus. Sed aliquam delectus id illum assumenda 33 dolor distinctio qui galisum minus.
+
+Ut aperiam voluptas ad dolor omnis qui dolorem iure sed obcaecati dicta. Et temporibus consequuntur ut veniam alias qui quos quam ea distinctio iusto. Et totam voluptatem et officia omnis sit ipsam omnis. Et expedita itaque ea repellendus sunt ut ipsam ipsam et libero amet et ipsam numquam. Cum officiis enim eum odio veritatis nemo nemo ut quia corporis a modi pariatur. Id modi quae ex magni itaque aut quibusdam ipsam est dolorem facere. Et praesentium enim ea autem nostrum id necessitatibus quod aut rerum consequatur. Aut velit eaque eum omnis quia qui galisum corrupti est nesciunt dolores.
+
+Qui molestiae cumque aut dolores rerum ut soluta recusandae ex autem repellat eum sunt magni. Ab tempore voluptas ex molestiae quam aut assumenda illo id nostrum neque est nisi veniam. Sit error iure ut nihil deleniti in harum iste hic explicabo labore aut ratione minima aut sapiente eaque sit maiores explicabo. Ea praesentium nostrum non dolor quia ut dolorem nesciunt. Sed iusto eaque nam quia itaque vel maxime fugit et perferendis dolor vel porro natus sit illo voluptas. Eum quasi aliquam ut iure galisum sit inventore repudiandae aut corporis illum. Ex consequuntur illo id odit reiciendis eum dolore unde sit ipsum tempore in sunt distinctio aut labore omnis. Qui distinctio eveniet et impedit velit sed quibusdam suscipit non quibusdam magnam sed similique quia? Est tenetur mollitia id eligendi libero 33 debitis sapiente. Est fuga quod aut corrupti aut mollitia eius. Sed recusandae quod eum cupiditate rerum sit dolor quod et quidem tempora in Quis natus qui velit maxime. Aut vero autem aut quae cupiditate aut inventore quam optio atque ut magni enim eos molestiae architecto. Qui expedita repudiandae ad modi fugiat sed molestiae quas. Et repellendus velit in voluptas harum ut reiciendis sunt a autem inventore id placeat odio est repellendus laborum.
+
+Cum numquam explicabo sed assumenda earum et distinctio impedit? Et sint vitae vel eligendi deleniti eum atque est nostrum. Qui laborum adipisci cum dolores assumenda est debitis ipsum quo nemo mollitia qui consequatur pariatur non recusandae esse. Et delectus rerum ut atque illum est incidunt molestiae ut sapiente harum. Qui quia architecto et placeat molestiae et optio fugit et rerum quisquam. Non sapiente distinctio cum fugit possimus 33 cupiditate autem in minus eius aut quis dolorum cum tempora eius in totam pariatur. Ut eveniet dolorem id voluptas reprehenderit eum saepe voluptatibus id dolorem beatae est facilis maxime ut animi quasi. Aut natus itaque ad consequatur sunt ut dolores voluptates.
+
+Qui rerum labore 33 dolorem quasi ea quia commodi hic quae deleniti in voluptatem laudantium sit dolor animi ea voluptatibus voluptas. Est maiores voluptatem est voluptatem recusandae et voluptatem deleniti sit error autem et error vitae aut debitis aliquid. Quo quam eligendi vel accusantium nemo ut atque alias et galisum voluptatum et ducimus voluptatibus a consequatur voluptate id quis repudiandae? Aut molestiae suscipit est necessitatibus reiciendis ut repellendus obcaecati est officiis omnis sit perspiciatis vero sit ullam voluptas et consequuntur velit. Vel ipsa enim eum quae veritatis qui consequatur quaerat quo suscipit galisum ut rerum tenetur aut recusandae dicta a porro voluptas. Ut minima internos in dolor accusantium vel unde odio cum aperiam dolorum ut perspiciatis nulla ad omnis voluptas sed dolores beatae. Impedit internos sed sapiente cupiditate ut cupiditate qui corrupti accusantium? Eum voluptas unde non exercitationem Quis non laborum illum.
+
+Aut iusto quam ab officiis labore est voluptatem maxime. Et quaerat nostrum sit omnis velit non alias corporis rem nemo nihil. Hic quisquam repellendus id vitae voluptas eum quidem nihil in rerum fuga 33 tempora ducimus. Est laborum reprehenderit cum ipsa unde ad dolores praesentium est autem assumenda rem galisum itaque et cumque explicabo in rerum vero. Et Quis blanditiis vel impedit eligendi nam numquam sint. Non repudiandae libero aut neque explicabo hic suscipit reiciendis. Eum dolorem maiores id placeat culpa et error distinctio et cumque minus aut itaque quaerat sit velit quia eos laborum culpa. Non rerum obcaecati cum soluta deserunt non sunt modi sit dolores quia cum dicta nulla vel rerum adipisci. Sit incidunt nihil sed omnis beatae sit nemo labore. Sit impedit animi At fugit ducimus et enim rerum sed nisi quibusdam et soluta fugit eum rerum unde sed impedit incidunt? Ut nesciunt consequatur rem porro galisum et mollitia impedit aut quibusdam molestias ea error animi sed repellendus nihil.
+
+Perferendis magnam id sapiente quos aut placeat optio At quia fugit sit quisquam vitae vel voluptas sunt ea molestias galisum. Non sequi necessitatibus eum voluptate accusamus qui nesciunt cumque a excepturi vero ea tempora voluptate et enim molestias ad nostrum Quis. Ea molestiae autem et voluptas libero rem fugit rerum ut animi suscipit et quisquam voluptatem non dolores doloremque eum unde alias? Et excepturi temporibus vel minima sint et asperiores tempora vel suscipit amet et galisum porro. Est dicta consequatur aut molestiae fuga ut animi dolores aut nesciunt officiis nam dolor ullam. Non laudantium placeat a dolorem accusamus ea temporibus pariatur vel aspernatur maxime id galisum consectetur est necessitatibus animi. Et voluptas facilis aut minima provident ex libero commodi et aspernatur voluptatem a odit aliquam! Vel tenetur iste qui beatae ducimus eos ipsa illum quo tenetur nemo. Placeat ipsum hic placeat cupiditate sed molestias praesentium eum inventore reprehenderit ea dolor recusandae est obcaecati temporibus et quaerat enim. Eos vitae odit a facilis laborum est voluptatem nisi qui deserunt optio id earum quam a vitae sint ea consectetur omnis. Est sunt alias ea distinctio blanditiis et beatae ipsam ut praesentium totam non eaque corporis non neque cupiditate aut aperiam commodi.
+
+Ut nemo quia ea molestiae magnam et repellendus dicta 33 aperiam ullam. Vel ducimus velit est aliquid necessitatibus et sunt quia id dolore error in quisquam sed dolorem iure sed enim facere. Totam enim eos veniam voluptatem est enim dolorem vel praesentium debitis et quam recusandae aut atque exercitationem et cupiditate natus. Eos dolorum ratione ad architecto perferendis et neque dolores et quod assumenda qui voluptates consequuntur. A minus iste et quia sint et accusamus molestiae. Qui rerum natus ut consequuntur quod ut perspiciatis autem ut dicta voluptatem aut consequuntur amet? Quo possimus quae et commodi sunt et aspernatur ipsa? Sit commodi quia nam minus possimus id sint laboriosam.
+
+In numquam atque non rerum nesciunt aut consequatur dolore ex ducimus neque quo voluptas excepturi ex similique exercitationem. Sed unde rerum ut vitae consequatur voluptates assumenda quo nihil corporis eos autem aperiam vel mollitia suscipit At quasi repudiandae. Et amet eius vel molestias autem ab veritatis consequatur ea saepe minus ut molestias necessitatibus est quia facere ut reprehenderit tempore. Est ullam itaque et explicabo omnis et quos beatae cum dolore deleniti. Sed temporibus recusandae et molestias delectus id temporibus sapiente id tenetur consequatur nam sint dolore eos consectetur saepe! Et libero animi quo libero sint id enim blanditiis aut fugiat quas et numquam impedit aut odio molestias. Vel optio temporibus ea accusantium quaerat ut itaque magnam ea inventore omnis. Et omnis nemo eos distinctio dolore rem aliquam sint At obcaecati doloribus qui internos sed perspiciatis ducimus et sunt dignissimos. Ut quidem ratione qui doloremque delectus in numquam reiciendis ut numquam nobis sed mollitia modi. Aut nesciunt quis et laudantium dolorum beatae repudiandae et tempora officia. Est unde amet cum dolor a rerum iusto et dolorem ipsum aut voluptatibus quia quo sunt consequatur aut molestiae aliquam?
+
+Aut iste dolor eum doloremque consequuntur et voluptas galisum. In similique soluta aut ullam dolore eum itaque maiores. Id porro quibusdam eos debitis galisum ea fugiat provident est molestiae enim et veniam dicta est sequi consequatur. Qui mollitia impedit qui error illo aut optio aperiam ut voluptatum quaerat in nihil alias vel aliquid aperiam. Ea nisi quas ut quaerat voluptatum eos porro molestiae hic voluptas odit. Qui esse adipisci est velit ipsum rem alias velit eum dignissimos autem aut possimus ipsam. Et dolore facere nam voluptas enim hic mollitia fugit sit porro ducimus est necessitatibus dolorem? Eum quae nihil sit nulla possimus ut assumenda internos.
+
+Aut autem facere et quis placeat et laborum excepturi aut necessitatibus galisum sit nemo quibusdam et rerum deleniti sit veritatis ipsum. Qui sequi necessitatibus sit quidem quia nam saepe velit quo mollitia impedit quo maxime dolorum in culpa eveniet et voluptas eveniet. Est autem soluta sed asperiores dolorum et sint corporis nam voluptas internos? Id velit fuga sed rerum nihil ut labore ratione et reiciendis dolorem non impedit sint eos fuga dignissimos ad nemo nihil. Non dolorem asperiores qui illum internos vel magnam quo dolores nostrum hic velit Quis qui sunt voluptatem quo quia quia. Et culpa rerum ut quisquam minus sit quibusdam dolor aut quia optio eum delectus iusto qui dicta sunt est molestias velit. Ut suscipit neque sit illum rerum aut quos adipisci et recusandae magni nam voluptatem sint eum galisum delectus. Est quia numquam hic omnis voluptatem rem sint galisum est adipisci ducimus non architecto asperiores.
+
+Nam nesciunt repellendus et temporibus sunt ut adipisci id animi nisi. Ut cupiditate temporibus cum animi laudantium aut quisquam rerum sed nesciunt consequuntur aut internos corporis et voluptatem animi. Aut voluptatum error quo velit rerum quo voluptas sunt sit deleniti autem qui nesciunt labore est ducimus sequi. Eum molestiae blanditiis sit quia perferendis et vitae distinctio rem nostrum velit sit voluptate voluptatem. A nemo voluptatem et velit optio qui vero assumenda. In placeat delectus et commodi fugit non deserunt reprehenderit sed deserunt commodi a dolor quod et voluptatem ipsum. A consectetur quae est assumenda assumenda sit omnis ducimus et amet accusantium rem dolorem rerum id esse sunt et optio accusamus! Ut autem alias a officiis quidem vel eligendi autem non temporibus quae et molestiae assumenda! Ex iusto maxime qui autem eius sit nemo aliquam ab alias rerum quo omnis eius ut soluta iusto. Et libero doloribus non odit ipsum cum voluptatum obcaecati sit asperiores nulla ut quos labore. Et laudantium quis aut fuga laborum in dolor magnam.
+
+Vel rerum nisi cum quidem suscipit hic blanditiis dolore ea consectetur ipsa aut fugiat accusantium aut modi ipsa. Qui laudantium nobis qui aliquid asperiores qui dolores rerum qui numquam maxime. Est sunt officia et incidunt corrupti qui quisquam repudiandae non voluptatum nisi eum voluptatem tempora est doloribus quisquam sit nemo tenetur! Ad dignissimos dicta aut necessitatibus quia ut eligendi recusandae. Est obcaecati sunt qui dolor rerum sit obcaecati internos non dolorem repudiandae est quibusdam consequatur qui ipsa enim? Et voluptates aliquam aut eligendi unde non nihil accusamus. Qui molestiae quisquam non autem quia et consectetur laudantium vel temporibus amet cum laboriosam excepturi ut sunt galisum? Aut quibusdam sed dolorem maxime qui deleniti maiores aut corporis voluptatem qui alias cumque est magni neque? In ullam fuga et minus laboriosam et cumque omnis cum dignissimos accusamus. In inventore accusamus et mollitia iure eum consequatur nesciunt? Est quidem similique et eaque autem rem illum aperiam ea eligendi saepe et laudantium molestias eum totam totam et error praesentium. Non rerum voluptatibus et expedita natus sed consequatur doloremque qui fugiat atque aut nesciunt molestiae ea voluptatem molestias. Ea suscipit dolores aut neque autem rem adipisci officiis qui cumque iusto sit odit omnis. Cum sequi dolore aut quos saepe cum voluptas esse At autem ratione a iure modi et numquam commodi est odio suscipit.
+
+Quo nisi minima vel magnam animi et quis ipsa et molestiae ipsum At inventore ipsam vel optio nisi et eveniet quos. Et alias numquam a quae iure qui perspiciatis repellendus et velit consequatur et fugiat sunt eos minus ratione At iste rerum. Eum quia ratione ut suscipit enim quo voluptatem enim quasi fugiat ut nesciunt perspiciatis est consequatur perferendis error officiis. Hic iste ducimus et tempora iure qui error blanditiis est aliquid accusantium ut dignissimos doloribus ea quia magnam non fugit quod. At illo aspernatur sed aliquid omnis sed quaerat voluptatem eum sunt dignissimos et ullam sunt rem dolorem expedita. Et laborum sint aut nisi voluptas ut molestias laborum. Quo illum expedita quo unde obcaecati sit itaque ratione ea labore labore vel ratione voluptatem et delectus autem cum ipsa repellat? Vel velit dolorum ea distinctio distinctio nam illo dolorem vel nobis velit. Ea obcaecati assumenda et explicabo sapiente ea maiores assumenda qui reiciendis temporibus sed voluptatem odit. Eos optio itaque non quos deleniti ad galisum galisum qui omnis fugit libero dolores. Ad autem voluptates eos totam facilis et atque minima et blanditiis exercitationem id consectetur doloribus. Et rerum reiciendis non omnis voluptatem ad totam internos sit modi consequatur ut quia voluptatem ut eaque dolor. Nam fugit deleniti et ullam consequatur et esse vero id debitis tempore. Rem assumenda harum et iusto blanditiis At repellendus ipsum ea autem sapiente.
+
diff --git a/tests/benchmarks/corelib/text/qstringtokenizer/tst_bench_qstringtokenizer.cpp b/tests/benchmarks/corelib/text/qstringtokenizer/tst_bench_qstringtokenizer.cpp
new file mode 100644
index 0000000000..eccfad91da
--- /dev/null
+++ b/tests/benchmarks/corelib/text/qstringtokenizer/tst_bench_qstringtokenizer.cpp
@@ -0,0 +1,120 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include <QtTest/QTest>
+
+#include <QStringTokenizer>
+
+class tst_QStringTokenizer : public QObject
+{
+ Q_OBJECT
+
+ void tokenize_data() const;
+ template <typename T, typename U>
+ void tokenize() const;
+private slots:
+ void tokenize_qlatin1string_qlatin1string_data() const { tokenize_data(); }
+ void tokenize_qlatin1string_qlatin1string() const { tokenize<QLatin1String, QLatin1String>(); }
+ void tokenize_qstring_qstring_data() const { tokenize_data(); }
+ void tokenize_qstring_qstring() const { tokenize<QString, QString>(); }
+ void tokenize_qlatin1string_qstring_data() const { tokenize_data(); }
+ void tokenize_qlatin1string_qstring() const { tokenize<QLatin1String, QString>(); }
+ void tokenize_qstring_qlatin1string_data() const { tokenize_data(); }
+ void tokenize_qstring_qlatin1string() const { tokenize<QString, QLatin1String>(); }
+};
+
+template<typename T>
+T fromByteArray(QByteArrayView v);
+
+template<>
+QString fromByteArray<QString>(QByteArrayView v)
+{
+ return QString::fromLatin1(v);
+}
+
+template<>
+QLatin1String fromByteArray<QLatin1String>(QByteArrayView v)
+{
+ return QLatin1String(v.data(), v.size());
+}
+
+void tst_QStringTokenizer::tokenize_data() const
+{
+ QTest::addColumn<QByteArray>("input");
+ QTest::addColumn<QByteArray>("separator");
+ QTest::addColumn<bool>("caseSensitive");
+ QTest::addColumn<int>("expectedCount");
+
+ QByteArray shortSentence = "A seriously short sentence.";
+ QTest::addRow("short-sentence-spaces") << shortSentence << QByteArray(" ") << true << 4;
+ QTest::addRow("short-sentence-spaces-case-insensitive")
+ << shortSentence << QByteArray(" ") << false << 4;
+
+ QTest::addRow("short-sentence-se") << shortSentence << QByteArray("se") << true << 3;
+ QTest::addRow("short-sentence-se-case-insensitive")
+ << shortSentence << QByteArray("Se") << false << 3;
+
+ QFile file(":/data/lorem.txt");
+ if (!file.open(QFile::ReadOnly))
+ qFatal("Can't open lorem.txt");
+
+ const QByteArray content = file.readAll();
+ QTest::addRow("lorem-ipsum-spaces") << content << QByteArray(" ") << true << 3250;
+ QTest::addRow("lorem-ipsum-spaces-case-insensitive")
+ << content << QByteArray(" ") << false << 3250;
+
+ QTest::addRow("lorem-ipsum-l") << content << QByteArray("l") << true << 771;
+ QTest::addRow("lorem-ipsum-l-case-insensitive")
+ << content << QByteArray("l") << false << 772;
+
+ QTest::addRow("lorem-ipsum-lo") << content << QByteArray("lo") << true << 130;
+ QTest::addRow("lorem-ipsum-lo-case-insensitive")
+ << content << QByteArray("lo") << false << 131;
+
+ QTest::addRow("lorem-ipsum-lor") << content << QByteArray("lor") << true << 122;
+ QTest::addRow("lorem-ipsum-lor-case-insensitive")
+ << content << QByteArray("lor") << false << 123;
+
+ QTest::addRow("lorem-ipsum-lore") << content << QByteArray("lore") << true << 73;
+ QTest::addRow("lorem-ipsum-lore-case-insensitive")
+ << content << QByteArray("lore") << false << 74;
+
+ QTest::addRow("lorem-ipsum-lorem") << content << QByteArray("lorem") << true << 34;
+ QTest::addRow("lorem-ipsum-lorem-case-insensitive")
+ << content << QByteArray("lorem") << false << 35;
+
+ QTest::addRow("lorem-ipsum-lorem i") << content << QByteArray("lorem i") << true << 5;
+ QTest::addRow("lorem-ipsum-lorem i-case-insensitive")
+ << content << QByteArray("lorem i") << false << 6;
+
+ QTest::addRow("lorem-ipsum-et explicabo s") << content << QByteArray("et explicabo s") << true << 3;
+ QTest::addRow("lorem-ipsum-et explicabo s-case-insensitive")
+ << content << QByteArray("et explicabo s") << false << 3;
+}
+
+template<typename T, typename U>
+void tst_QStringTokenizer::tokenize() const
+{
+ QFETCH(QByteArray, input);
+ QFETCH(QByteArray, separator);
+ QFETCH(bool, caseSensitive);
+ QFETCH(int, expectedCount);
+
+ T haystack = fromByteArray<T>(input);
+ U needle = fromByteArray<U>(separator);
+
+ const Qt::CaseSensitivity sensitivity = caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive;
+ QBENCHMARK {
+ QStringTokenizer tok(haystack, needle, sensitivity);
+ qsizetype count = 0;
+ for (auto res : tok) {
+ count++;
+ Q_UNUSED(res);
+ }
+ QCOMPARE(count, expectedCount);
+ }
+}
+
+QTEST_MAIN(tst_QStringTokenizer)
+
+#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 dc257262a3..48bf0572a6 100644
--- a/tests/benchmarks/corelib/thread/CMakeLists.txt
+++ b/tests/benchmarks/corelib/thread/CMakeLists.txt
@@ -1,5 +1,7 @@
-# Generated from thread.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+add_subdirectory(qfuture)
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
new file mode 100644
index 0000000000..5988b1c0b0
--- /dev/null
+++ b/tests/benchmarks/corelib/thread/qfuture/CMakeLists.txt
@@ -0,0 +1,14 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#####################################################################
+## tst_bench_qfuture Binary:
+#####################################################################
+
+qt_internal_add_benchmark(tst_bench_qfuture
+ EXCEPTIONS
+ SOURCES
+ tst_bench_qfuture.cpp
+ LIBRARIES
+ Qt::Test
+)
diff --git a/tests/benchmarks/corelib/thread/qfuture/tst_bench_qfuture.cpp b/tests/benchmarks/corelib/thread/qfuture/tst_bench_qfuture.cpp
new file mode 100644
index 0000000000..38b3f636c9
--- /dev/null
+++ b/tests/benchmarks/corelib/thread/qfuture/tst_bench_qfuture.cpp
@@ -0,0 +1,297 @@
+// 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
+{
+ Q_OBJECT
+
+private slots:
+ void makeReadyValueFuture();
+#ifndef QT_NO_EXCEPTIONS
+ void makeExceptionalFuture();
+#endif
+ void result();
+ void results();
+ void takeResult();
+ void reportResult();
+ void reportResults();
+ void reportResultsManualProgress();
+#ifndef QT_NO_EXCEPTIONS
+ void reportException();
+#endif
+ void then();
+ void thenVoid();
+ void onCanceled();
+ void onCanceledVoid();
+#ifndef QT_NO_EXCEPTIONS
+ void onFailed();
+ void onFailedVoid();
+ void thenOnFailed();
+ void thenOnFailedVoid();
+#endif
+ void reportProgress();
+ void progressMinimum();
+ void progressMaximum();
+ void progressValue();
+ void progressText();
+};
+
+void tst_QFuture::makeReadyValueFuture()
+{
+ QBENCHMARK {
+ auto future = QtFuture::makeReadyValueFuture(42);
+ Q_UNUSED(future);
+ }
+}
+
+#ifndef QT_NO_EXCEPTIONS
+void tst_QFuture::makeExceptionalFuture()
+{
+ QException e;
+ QBENCHMARK {
+ auto future = QtFuture::makeExceptionalFuture(e);
+ Q_UNUSED(future);
+ }
+}
+#endif
+
+void tst_QFuture::result()
+{
+ auto future = QtFuture::makeReadyValueFuture(42);
+
+ QBENCHMARK {
+ auto value = future.result();
+ Q_UNUSED(value);
+ }
+}
+
+void tst_QFuture::results()
+{
+ QFutureInterface<int> fi;
+ fi.reportStarted();
+
+ for (int i = 0; i < 1000; ++i)
+ fi.reportResult(i);
+
+ fi.reportFinished();
+
+ auto future = fi.future();
+ QBENCHMARK {
+ auto values = future.results();
+ Q_UNUSED(values);
+ }
+}
+
+void tst_QFuture::takeResult()
+{
+ QBENCHMARK {
+ auto future = QtFuture::makeReadyValueFuture(42);
+ auto value = future.takeResult();
+ Q_UNUSED(value);
+ }
+}
+
+void tst_QFuture::reportResult()
+{
+ QFutureInterface<int> fi;
+ QBENCHMARK {
+ fi.reportResult(42);
+ }
+}
+
+void tst_QFuture::reportResults()
+{
+ QFutureInterface<int> fi;
+ QList<int> values(1000);
+ std::iota(values.begin(), values.end(), 0);
+ QBENCHMARK {
+ fi.reportResults(values);
+ }
+}
+
+void tst_QFuture::reportResultsManualProgress()
+{
+ QFutureInterface<int> fi;
+ const int resultCount = 1000;
+ fi.setProgressRange(0, resultCount);
+ QBENCHMARK {
+ for (int i = 0; i < resultCount; ++i)
+ fi.reportResult(i);
+ }
+}
+
+#ifndef QT_NO_EXCEPTIONS
+void tst_QFuture::reportException()
+{
+ QException e;
+ QBENCHMARK {
+ QFutureInterface<int> fi;
+ fi.reportException(e);
+ }
+}
+#endif
+
+void tst_QFuture::then()
+{
+ auto f = QtFuture::makeReadyValueFuture(42);
+ QBENCHMARK {
+ auto future = f.then([](int value) { return value; });
+ Q_UNUSED(future);
+ }
+}
+
+void tst_QFuture::thenVoid()
+{
+ auto f = QtFuture::makeReadyVoidFuture();
+ QBENCHMARK {
+ auto future = f.then([] {});
+ Q_UNUSED(future);
+ }
+}
+
+void tst_QFuture::onCanceled()
+{
+ QFutureInterface<int> fi;
+ fi.reportStarted();
+ fi.reportCanceled();
+ fi.reportFinished();
+
+ QBENCHMARK {
+ auto future = fi.future().onCanceled([] { return 0; });
+ Q_UNUSED(future);
+ }
+}
+
+void tst_QFuture::onCanceledVoid()
+{
+ QFutureInterface<void> fi;
+ fi.reportStarted();
+ fi.reportCanceled();
+ fi.reportFinished();
+
+ QBENCHMARK {
+ auto future = fi.future().onCanceled([] {});
+ Q_UNUSED(future);
+ }
+}
+
+#ifndef QT_NO_EXCEPTIONS
+void tst_QFuture::onFailed()
+{
+ QException e;
+ auto f = QtFuture::makeExceptionalFuture<int>(e);
+ QBENCHMARK {
+ auto future = f.onFailed([] { return 0; });
+ Q_UNUSED(future);
+ }
+}
+
+void tst_QFuture::onFailedVoid()
+{
+ QException e;
+ auto f = QtFuture::makeExceptionalFuture(e);
+ QBENCHMARK {
+ auto future = f.onFailed([] {});
+ Q_UNUSED(future);
+ }
+}
+
+void tst_QFuture::thenOnFailed()
+{
+ auto f = QtFuture::makeReadyValueFuture(42);
+ QBENCHMARK {
+ auto future =
+ f.then([](int) { throw std::runtime_error("error"); }).onFailed([] { return 0; });
+ Q_UNUSED(future);
+ }
+}
+
+void tst_QFuture::thenOnFailedVoid()
+{
+ auto f = QtFuture::makeReadyVoidFuture();
+ QBENCHMARK {
+ auto future = f.then([] { throw std::runtime_error("error"); }).onFailed([] {});
+ Q_UNUSED(future);
+ }
+}
+
+#endif
+
+void tst_QFuture::reportProgress()
+{
+ QFutureInterface<void> fi;
+ fi.reportStarted();
+ fi.reportFinished();
+ QBENCHMARK {
+ for (int i = 0; i < 100; ++i) {
+ fi.setProgressValue(i);
+ }
+ }
+}
+
+void tst_QFuture::progressMinimum()
+{
+ QFutureInterface<void> fi;
+ fi.setProgressRange(0, 100);
+ fi.reportStarted();
+ fi.reportFinished();
+ auto future = fi.future();
+
+ QBENCHMARK {
+ auto value = future.progressMinimum();
+ Q_UNUSED(value);
+ }
+}
+
+void tst_QFuture::progressMaximum()
+{
+ QFutureInterface<void> fi;
+ fi.setProgressRange(0, 100);
+ fi.reportStarted();
+ fi.reportFinished();
+ auto future = fi.future();
+
+ QBENCHMARK {
+ auto value = future.progressMaximum();
+ Q_UNUSED(value);
+ }
+}
+
+void tst_QFuture::progressValue()
+{
+ QFutureInterface<void> fi;
+ fi.setProgressValue(50);
+ fi.reportStarted();
+ fi.reportFinished();
+ auto future = fi.future();
+
+ QBENCHMARK {
+ auto value = future.progressValue();
+ Q_UNUSED(value);
+ }
+}
+
+void tst_QFuture::progressText()
+{
+ QFutureInterface<void> fi;
+ fi.setProgressValueAndText(50, "text");
+ fi.reportStarted();
+ fi.reportFinished();
+ auto future = fi.future();
+
+ QBENCHMARK {
+ auto text = future.progressText();
+ Q_UNUSED(text);
+ }
+}
+
+QTEST_MAIN(tst_QFuture)
+
+#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 f8ca632beb..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)
@@ -149,7 +128,7 @@ void tst_QDate::daysInYear()
{
const auto list = yearly(1601, 2401);
QBENCHMARK {
- for (const QDate date : list)
+ for (const QDate &date : list)
date.daysInYear();
}
}
@@ -167,7 +146,7 @@ void tst_QDate::getSetDate()
QDate store;
const auto list = daily(JULIAN_DAY_2010, JULIAN_DAY_2020);
QBENCHMARK {
- for (const auto test : list) {
+ for (const auto &test : list) {
int year, month, day;
test.getDate(&year, &month, &day);
store.setDate(year, month, day);
@@ -181,7 +160,7 @@ void tst_QDate::addDays()
QDate store;
const auto list = daily(JULIAN_DAY_2010, JULIAN_DAY_2020);
QBENCHMARK {
- for (const auto test : list)
+ for (const auto &test : list)
store = test.addDays(17);
}
Q_UNUSED(store);
@@ -192,7 +171,7 @@ void tst_QDate::addMonths()
QDate store;
const auto list = daily(JULIAN_DAY_2010, JULIAN_DAY_2020);
QBENCHMARK {
- for (const auto test : list)
+ for (const auto &test : list)
store = test.addMonths(17);
}
Q_UNUSED(store);
@@ -203,11 +182,34 @@ void tst_QDate::addYears()
QDate store;
const auto list = daily(JULIAN_DAY_2010, JULIAN_DAY_2020);
QBENCHMARK {
- for (const auto test : list)
+ for (const auto &test : list)
store = test.addYears(17);
}
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 98716e83a9..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>
@@ -55,7 +30,7 @@ T * f(T *ts) // dummy function to prevent code from being optimized away by the
template<typename T>
class UseCases_QList : public UseCases<T>
{
- void insert(int size)
+ void insert(int size) override
{
QList<T> v;
T t{};
@@ -65,7 +40,7 @@ class UseCases_QList : public UseCases<T>
}
}
- void lookup(int size)
+ void lookup(int size) override
{
QList<T> v;
@@ -87,21 +62,21 @@ class UseCases_QList : public UseCases<T>
template <typename T>
class UseCases_stdvector : public UseCases<T>
{
- void insert(int size)
+ 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);
}
}
- void lookup(int size)
+ void lookup(int size) override
{
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 792132cc47..0000000000
--- a/tests/benchmarks/corelib/tools/qcryptographichash/main.cpp
+++ /dev/null
@@ -1,172 +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-";
- }
- Q_UNREACHABLE();
- return 0;
-}
-
-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/main.cpp
deleted file mode 100644
index 3426336cb7..0000000000
--- a/tests/benchmarks/corelib/tools/qlist/main.cpp
+++ /dev/null
@@ -1,560 +0,0 @@
-/****************************************************************************
-**
-** 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$
-**
-****************************************************************************/
-
-#include <QList>
-#include <QTest>
-
-#include <utility>
-
-static const int N = 1000;
-
-struct MyBase
-{
- MyBase(int i_)
- : isCopy(false)
- {
- ++liveCount;
-
- i = i_;
- }
-
- MyBase(const MyBase &other)
- : isCopy(true)
- {
- if (isCopy)
- ++copyCount;
- ++liveCount;
-
- 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 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; }
-};
-
-struct MyMovable : public MyBase
-{
- MyMovable(int i = -1) : MyBase(i) {}
-};
-
-struct MyComplex : public MyBase
-{
- MyComplex(int i = -1) : MyBase(i) {}
-};
-
-QT_BEGIN_NAMESPACE
-
-Q_DECLARE_TYPEINFO(MyPrimitive, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(MyMovable, Q_RELOCATABLE_TYPE);
-Q_DECLARE_TYPEINFO(MyComplex, Q_COMPLEX_TYPE);
-
-QT_END_NAMESPACE
-
-
-class tst_QList: public QObject
-{
- Q_OBJECT
-
-private Q_SLOTS:
- void removeAll_primitive_data();
- void removeAll_primitive();
- void removeAll_movable_data();
- void removeAll_movable();
- void removeAll_complex_data();
- void removeAll_complex();
-
- // append 1 element:
- void appendOne_int_data() const { commonBenchmark_data<int>(); }
- void appendOne_primitive_data() const { commonBenchmark_data<MyPrimitive>(); }
- void appendOne_movable_data() const { commonBenchmark_data<MyMovable>(); }
- void appendOne_complex_data() const { commonBenchmark_data<MyComplex>(); }
- void appendOne_QString_data() const { commonBenchmark_data<QString>(); }
-
- void appendOne_int() const { appendOne_impl<QList, int>(); } // QTBUG-87330
- void appendOne_primitive() const { appendOne_impl<QList, MyPrimitive>(); }
- void appendOne_movable() const { appendOne_impl<QList, MyMovable>(); }
- void appendOne_complex() const { appendOne_impl<QList, MyComplex>(); }
- void appendOne_QString() const { appendOne_impl<QList, QString>(); }
-
- // prepend 1 element:
- void prependOne_int_data() const { commonBenchmark_data<int>(); }
- void prependOne_primitive_data() const { commonBenchmark_data<MyPrimitive>(); }
- void prependOne_movable_data() const { commonBenchmark_data<MyMovable>(); }
- void prependOne_complex_data() const { commonBenchmark_data<MyComplex>(); }
- void prependOne_QString_data() const { commonBenchmark_data<QString>(); }
-
- void prependOne_int() const { prependOne_impl<QList, int>(); }
- void prependOne_primitive() const { prependOne_impl<QList, MyPrimitive>(); }
- void prependOne_movable() const { prependOne_impl<QList, MyMovable>(); }
- 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>(); }
-
- void midInsertOne_int() const { midInsertOne_impl<QList, int>(); }
- void midInsertOne_primitive() const { midInsertOne_impl<QList, MyPrimitive>(); }
- void midInsertOne_movable() const { midInsertOne_impl<QList, MyMovable>(); }
- void midInsertOne_complex() const { midInsertOne_impl<QList, MyComplex>(); }
- void midInsertOne_QString() const { midInsertOne_impl<QList, QString>(); }
-
- // append/prepend 1 element - hard times for branch predictor:
- void appendPrependOne_int_data() const { commonBenchmark_data<int>(); }
- void appendPrependOne_primitive_data() const { commonBenchmark_data<MyPrimitive>(); }
- void appendPrependOne_movable_data() const { commonBenchmark_data<MyMovable>(); }
- void appendPrependOne_complex_data() const { commonBenchmark_data<MyComplex>(); }
- void appendPrependOne_QString_data() const { commonBenchmark_data<QString>(); }
-
- void appendPrependOne_int() const { appendPrependOne_impl<QList, int>(); }
- void appendPrependOne_primitive() const { appendPrependOne_impl<QList, MyPrimitive>(); }
- void appendPrependOne_movable() const { appendPrependOne_impl<QList, MyMovable>(); }
- void appendPrependOne_complex() const { appendPrependOne_impl<QList, MyComplex>(); }
- void appendPrependOne_QString() const { appendPrependOne_impl<QList, QString>(); }
-
- // prepend half elements, then appen another half:
- void prependAppendHalvesOne_int_data() const { commonBenchmark_data<int>(); }
- void prependAppendHalvesOne_primitive_data() const { commonBenchmark_data<MyPrimitive>(); }
- void prependAppendHalvesOne_movable_data() const { commonBenchmark_data<MyMovable>(); }
- void prependAppendHalvesOne_complex_data() const { commonBenchmark_data<MyComplex>(); }
- void prependAppendHalvesOne_QString_data() const { commonBenchmark_data<QString>(); }
-
- void prependAppendHalvesOne_int() const { prependAppendHalvesOne_impl<QList, int>(); }
- void prependAppendHalvesOne_primitive() const
- {
- prependAppendHalvesOne_impl<QList, MyPrimitive>();
- }
- void prependAppendHalvesOne_movable() const { prependAppendHalvesOne_impl<QList, MyMovable>(); }
- 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>(); }
-
- void midEmplaceOne_int() const { midEmplaceOne_impl<QList, int>(); }
- void midEmplaceOne_primitive() const { midEmplaceOne_impl<QList, MyPrimitive>(); }
- void midEmplaceOne_movable() const { midEmplaceOne_impl<QList, MyMovable>(); }
- void midEmplaceOne_complex() const { midEmplaceOne_impl<QList, MyComplex>(); }
- void midEmplaceOne_QString() const { midEmplaceOne_impl<QList, QString>(); }
-
-// For 5.15 we also want to compare against QVector
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
- // append 1 element:
- void qvector_appendOne_int_data() const { commonBenchmark_data<int>(); }
- void qvector_appendOne_primitive_data() const { commonBenchmark_data<MyPrimitive>(); }
- void qvector_appendOne_movable_data() const { commonBenchmark_data<MyMovable>(); }
- void qvector_appendOne_complex_data() const { commonBenchmark_data<MyComplex>(); }
- void qvector_appendOne_QString_data() const { commonBenchmark_data<QString>(); }
-
- void qvector_appendOne_int() const { appendOne_impl<QVector, int>(); } // QTBUG-87330
- void qvector_appendOne_primitive() const { appendOne_impl<QVector, MyPrimitive>(); }
- void qvector_appendOne_movable() const { appendOne_impl<QVector, MyMovable>(); }
- void qvector_appendOne_complex() const { appendOne_impl<QVector, MyComplex>(); }
- void qvector_appendOne_QString() const { appendOne_impl<QVector, QString>(); }
-
- // prepend 1 element:
- void qvector_prependOne_int_data() const { commonBenchmark_data<int>(); }
- void qvector_prependOne_primitive_data() const { commonBenchmark_data<MyPrimitive>(); }
- void qvector_prependOne_movable_data() const { commonBenchmark_data<MyMovable>(); }
- void qvector_prependOne_complex_data() const { commonBenchmark_data<MyComplex>(); }
- void qvector_prependOne_QString_data() const { commonBenchmark_data<QString>(); }
-
- void qvector_prependOne_int() const { prependOne_impl<QVector, int>(); }
- void qvector_prependOne_primitive() const { prependOne_impl<QVector, MyPrimitive>(); }
- void qvector_prependOne_movable() const { prependOne_impl<QVector, MyMovable>(); }
- void qvector_prependOne_complex() const { prependOne_impl<QVector, MyComplex>(); }
- void qvector_prependOne_QString() const { prependOne_impl<QVector, QString>(); }
-
- // insert in middle 1 element:
- void qvector_midInsertOne_int_data() const { commonBenchmark_data<int>(); }
- void qvector_midInsertOne_primitive_data() const { commonBenchmark_data<MyPrimitive>(); }
- void qvector_midInsertOne_movable_data() const { commonBenchmark_data<MyMovable>(); }
- void qvector_midInsertOne_complex_data() const { commonBenchmark_data<MyComplex>(); }
- void qvector_midInsertOne_QString_data() const { commonBenchmark_data<QString>(); }
-
- void qvector_midInsertOne_int() const { midInsertOne_impl<QVector, int>(); }
- void qvector_midInsertOne_primitive() const { midInsertOne_impl<QVector, MyPrimitive>(); }
- void qvector_midInsertOne_movable() const { midInsertOne_impl<QVector, MyMovable>(); }
- void qvector_midInsertOne_complex() const { midInsertOne_impl<QVector, MyComplex>(); }
- void qvector_midInsertOne_QString() const { midInsertOne_impl<QVector, QString>(); }
-
- // append/prepend 1 element - hard times for branch predictor:
- void qvector_appendPrependOne_int_data() const { commonBenchmark_data<int>(); }
- void qvector_appendPrependOne_primitive_data() const { commonBenchmark_data<MyPrimitive>(); }
- void qvector_appendPrependOne_movable_data() const { commonBenchmark_data<MyMovable>(); }
- void qvector_appendPrependOne_complex_data() const { commonBenchmark_data<MyComplex>(); }
- void qvector_appendPrependOne_QString_data() const { commonBenchmark_data<QString>(); }
-
- void qvector_appendPrependOne_int() const { appendPrependOne_impl<QVector, int>(); }
- void qvector_appendPrependOne_primitive() const
- {
- appendPrependOne_impl<QVector, MyPrimitive>();
- }
- void qvector_appendPrependOne_movable() const { appendPrependOne_impl<QVector, MyMovable>(); }
- void qvector_appendPrependOne_complex() const { appendPrependOne_impl<QVector, MyComplex>(); }
- void qvector_appendPrependOne_QString() const { appendPrependOne_impl<QVector, QString>(); }
-
- // prepend half elements, then appen another half:
- void qvector_prependAppendHalvesOne_int_data() const { commonBenchmark_data<int>(); }
- void qvector_prependAppendHalvesOne_primitive_data() const
- {
- commonBenchmark_data<MyPrimitive>();
- }
- void qvector_prependAppendHalvesOne_movable_data() const { commonBenchmark_data<MyMovable>(); }
- void qvector_prependAppendHalvesOne_complex_data() const { commonBenchmark_data<MyComplex>(); }
- void qvector_prependAppendHalvesOne_QString_data() const { commonBenchmark_data<QString>(); }
-
- void qvector_prependAppendHalvesOne_int() const { prependAppendHalvesOne_impl<QVector, int>(); }
- void qvector_prependAppendHalvesOne_primitive() const
- {
- prependAppendHalvesOne_impl<QVector, MyPrimitive>();
- }
- void qvector_prependAppendHalvesOne_movable() const
- {
- prependAppendHalvesOne_impl<QVector, MyMovable>();
- }
- void qvector_prependAppendHalvesOne_complex() const
- {
- prependAppendHalvesOne_impl<QVector, MyComplex>();
- }
- void qvector_prependAppendHalvesOne_QString() const
- {
- prependAppendHalvesOne_impl<QVector, QString>();
- }
-
- // emplace in middle 1 element:
- void qvector_midEmplaceOne_int_data() const { commonBenchmark_data<int>(); }
- void qvector_midEmplaceOne_primitive_data() const { commonBenchmark_data<MyPrimitive>(); }
- void qvector_midEmplaceOne_movable_data() const { commonBenchmark_data<MyMovable>(); }
- void qvector_midEmplaceOne_complex_data() const { commonBenchmark_data<MyComplex>(); }
- void qvector_midEmplaceOne_QString_data() const { commonBenchmark_data<QString>(); }
-
- void qvector_midEmplaceOne_int() const { midEmplaceOne_impl<QVector, int>(); }
- void qvector_midEmplaceOne_primitive() const { midEmplaceOne_impl<QVector, MyPrimitive>(); }
- void qvector_midEmplaceOne_movable() const { midEmplaceOne_impl<QVector, MyMovable>(); }
- void qvector_midEmplaceOne_complex() const { midEmplaceOne_impl<QVector, MyComplex>(); }
- void qvector_midEmplaceOne_QString() const { midEmplaceOne_impl<QVector, QString>(); }
-#endif
-
-private:
- template<typename>
- void commonBenchmark_data() const;
-
- template<template<typename> typename, typename>
- void appendOne_impl() const;
-
- template<template<typename> typename, typename>
- void prependOne_impl() const;
-
- template<template<typename> typename, typename>
- void midInsertOne_impl() const;
-
- template<template<typename> typename, typename>
- void appendPrependOne_impl() const;
-
- template<template<typename> typename, typename>
- void prependAppendHalvesOne_impl() const;
-
- template<template<typename> typename, typename>
- void midEmplaceOne_impl() const;
-};
-
-template <class T>
-void removeAll_test(const QList<int> &i10, ushort valueToRemove, int itemsToRemove)
-{
- 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);
-
- 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);
-
- T t(valueToRemove);
- QCOMPARE(MyBase::liveCount, isComplex ? list.size() + 1 : 1);
- QCOMPARE(MyBase::copyCount, isComplex ? list.size() : 0);
-
- int removedCount;
- QList<T> l;
-
- QBENCHMARK {
- l = list;
- removedCount = l.removeAll(t);
- }
- QCOMPARE(removedCount, itemsToRemove * N);
- QCOMPARE(l.size() + removedCount, list.size());
- QVERIFY(!l.contains(valueToRemove));
-
- 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);
- }
- if (isComplex)
- QCOMPARE(MyBase::errorCount, 0);
-}
-
-
-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);
-}
-
-template<typename T>
-void tst_QList::commonBenchmark_data() const
-{
- QTest::addColumn<int>("elemCount");
-
- const auto addRow = [](int count, const char *text) { QTest::newRow(text) << count; };
-
- const auto p = [](int i, const char *text) { return std::make_pair(i, text); };
-
- // 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);
- }
-}
-
-template<template<typename> typename Container, typename T>
-void tst_QList::appendOne_impl() const
-{
- QFETCH(int, elemCount);
- constexpr auto getValue = []() { return T {}; };
-
- QBENCHMARK {
- Container<T> container;
- auto lvalue = getValue();
-
- for (int i = 0; i < elemCount; ++i) {
- container.append(lvalue);
- }
- }
-}
-
-template<template<typename> typename Container, typename T>
-void tst_QList::prependOne_impl() const
-{
- QFETCH(int, elemCount);
- constexpr auto getValue = []() { return T {}; };
-
- QBENCHMARK {
- Container<T> container;
- auto lvalue = getValue();
-
- for (int i = 0; i < elemCount; ++i) {
- container.prepend(lvalue);
- }
- }
-}
-
-template<template<typename> typename Container, typename T>
-void tst_QList::midInsertOne_impl() const
-{
- QFETCH(int, elemCount);
- constexpr auto getValue = []() { return T {}; };
-
- QBENCHMARK {
- Container<T> container;
- auto lvalue = getValue();
-
- for (int i = 0; i < elemCount; ++i) {
- container.insert(container.size() / 2, lvalue);
- }
- }
-}
-
-template<template<typename> typename Container, typename T>
-void tst_QList::appendPrependOne_impl() const
-{
- QFETCH(int, elemCount);
- constexpr auto getValue = []() { return T {}; };
-
- QBENCHMARK {
- Container<T> container;
- auto lvalue = getValue();
-
- for (int i = 0; i < elemCount; ++i) {
- if (i % 2 == 0) {
- container.append(lvalue);
- } else {
- container.prepend(lvalue);
- }
- }
- }
-}
-
-template<template<typename> typename Container, typename T>
-void tst_QList::prependAppendHalvesOne_impl() const
-{
- QFETCH(int, elemCount);
- constexpr auto getValue = []() { return T {}; };
-
- QBENCHMARK {
- Container<T> container;
- auto lvalue = getValue();
-
- for (int i = 0; i < elemCount / 2; ++i) {
- container.prepend(lvalue);
- }
-
- for (int i = elemCount / 2; i < elemCount; ++i) {
- container.append(lvalue);
- }
- }
-}
-
-template<template<typename> typename Container, typename T>
-void tst_QList::midEmplaceOne_impl() const
-{
- QFETCH(int, elemCount);
- constexpr auto getValue = []() { return T {}; };
-
- QBENCHMARK {
- Container<T> container;
- auto lvalue = getValue();
-
- for (int i = 0; i < elemCount; ++i) {
- container.emplace(container.size() / 2, lvalue);
- }
- }
-}
-
-QTEST_APPLESS_MAIN(tst_QList)
-
-#include "main.moc"
diff --git a/tests/benchmarks/corelib/tools/qlist/tst_bench_qlist.cpp b/tests/benchmarks/corelib/tools/qlist/tst_bench_qlist.cpp
new file mode 100644
index 0000000000..24691d1f71
--- /dev/null
+++ b/tests/benchmarks/corelib/tools/qlist/tst_bench_qlist.cpp
@@ -0,0 +1,410 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include <QList>
+#include <QTest>
+
+#include <utility>
+
+static const int N = 1000;
+
+struct MyBase
+{
+ MyBase(int i_) : i(i_) { }
+
+ MyBase(const MyBase &other) : i(other.i) { }
+
+ MyBase &operator=(const MyBase &other)
+ {
+ i = other.i;
+ return *this;
+ }
+
+ bool operator==(const MyBase &other) const
+ { return i == other.i; }
+
+protected:
+ int i;
+};
+
+struct MyPrimitive : public MyBase
+{
+ 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_) {}
+};
+
+struct MyComplex : public MyBase
+{
+ MyComplex(int i_ = -1) : MyBase(i_) {}
+};
+
+QT_BEGIN_NAMESPACE
+
+Q_DECLARE_TYPEINFO(MyPrimitive, Q_PRIMITIVE_TYPE);
+Q_DECLARE_TYPEINFO(MyMovable, Q_RELOCATABLE_TYPE);
+Q_DECLARE_TYPEINFO(MyComplex, Q_COMPLEX_TYPE);
+
+QT_END_NAMESPACE
+
+
+class tst_QList: public QObject
+{
+ Q_OBJECT
+
+ const int million = 1000000;
+private Q_SLOTS:
+ void removeAll_primitive_data();
+ 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>(); }
+ void appendOne_primitive_data() const { commonBenchmark_data<MyPrimitive>(); }
+ void appendOne_movable_data() const { commonBenchmark_data<MyMovable>(); }
+ void appendOne_complex_data() const { commonBenchmark_data<MyComplex>(); }
+ void appendOne_QString_data() const { commonBenchmark_data<QString>(); }
+
+ void appendOne_int() const { appendOne_impl<QList, int>(); } // QTBUG-87330
+ void appendOne_primitive() const { appendOne_impl<QList, MyPrimitive>(); }
+ void appendOne_movable() const { appendOne_impl<QList, MyMovable>(); }
+ void appendOne_complex() const { appendOne_impl<QList, MyComplex>(); }
+ void appendOne_QString() const { appendOne_impl<QList, QString>(); }
+
+ // prepend 1 element:
+ void prependOne_int_data() const { commonBenchmark_data<int>(); }
+ void prependOne_primitive_data() const { commonBenchmark_data<MyPrimitive>(); }
+ void prependOne_movable_data() const { commonBenchmark_data<MyMovable>(); }
+ void prependOne_complex_data() const { commonBenchmark_data<MyComplex>(); }
+ void prependOne_QString_data() const { commonBenchmark_data<QString>(); }
+
+ void prependOne_int() const { prependOne_impl<QList, int>(); }
+ void prependOne_primitive() const { prependOne_impl<QList, MyPrimitive>(); }
+ void prependOne_movable() const { prependOne_impl<QList, MyMovable>(); }
+ void prependOne_complex() const { prependOne_impl<QList, MyComplex>(); }
+ void prependOne_QString() const { prependOne_impl<QList, 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>(); }
+ void midInsertOne_movable() const { midInsertOne_impl<QList, MyMovable>(); }
+ void midInsertOne_complex() const { midInsertOne_impl<QList, MyComplex>(); }
+ void midInsertOne_QString() const { midInsertOne_impl<QList, QString>(); }
+
+ // append/prepend 1 element - hard times for branch predictor:
+ void appendPrependOne_int_data() const { commonBenchmark_data<int>(); }
+ void appendPrependOne_primitive_data() const { commonBenchmark_data<MyPrimitive>(); }
+ void appendPrependOne_movable_data() const { commonBenchmark_data<MyMovable>(); }
+ void appendPrependOne_complex_data() const { commonBenchmark_data<MyComplex>(); }
+ void appendPrependOne_QString_data() const { commonBenchmark_data<QString>(); }
+
+ void appendPrependOne_int() const { appendPrependOne_impl<QList, int>(); }
+ void appendPrependOne_primitive() const { appendPrependOne_impl<QList, MyPrimitive>(); }
+ void appendPrependOne_movable() const { appendPrependOne_impl<QList, MyMovable>(); }
+ void appendPrependOne_complex() const { appendPrependOne_impl<QList, MyComplex>(); }
+ void appendPrependOne_QString() const { appendPrependOne_impl<QList, QString>(); }
+
+ // prepend half elements, then appen another half:
+ void prependAppendHalvesOne_int_data() const { commonBenchmark_data<int>(); }
+ void prependAppendHalvesOne_primitive_data() const { commonBenchmark_data<MyPrimitive>(); }
+ void prependAppendHalvesOne_movable_data() const { commonBenchmark_data<MyMovable>(); }
+ void prependAppendHalvesOne_complex_data() const { commonBenchmark_data<MyComplex>(); }
+ void prependAppendHalvesOne_QString_data() const { commonBenchmark_data<QString>(); }
+
+ void prependAppendHalvesOne_int() const { prependAppendHalvesOne_impl<QList, int>(); }
+ void prependAppendHalvesOne_primitive() const
+ {
+ prependAppendHalvesOne_impl<QList, MyPrimitive>();
+ }
+ void prependAppendHalvesOne_movable() const { prependAppendHalvesOne_impl<QList, MyMovable>(); }
+ void prependAppendHalvesOne_complex() const { prependAppendHalvesOne_impl<QList, MyComplex>(); }
+ void prependAppendHalvesOne_QString() const { prependAppendHalvesOne_impl<QList, 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>(); }
+ void midEmplaceOne_movable() const { midEmplaceOne_impl<QList, MyMovable>(); }
+ void midEmplaceOne_complex() const { midEmplaceOne_impl<QList, MyComplex>(); }
+ void midEmplaceOne_QString() const { midEmplaceOne_impl<QList, QString>(); }
+
+ // remove from beginning in a general way
+ void removeFirstGeneral_int_data() const { commonBenchmark_data<int>(); }
+ void removeFirstGeneral_primitive_data() const { commonBenchmark_data<MyPrimitive>(); }
+ void removeFirstGeneral_movable_data() const { commonBenchmark_data<MyMovable>(); }
+ void removeFirstGeneral_complex_data() const { commonBenchmark_data<MyComplex>(); }
+ void removeFirstGeneral_QString_data() const { commonBenchmark_data<QString>(); }
+
+ void removeFirstGeneral_int() const { removeFirstGeneral_impl<QList, int>(); }
+ void removeFirstGeneral_primitive() const { removeFirstGeneral_impl<QList, MyPrimitive>(); }
+ void removeFirstGeneral_movable() const { removeFirstGeneral_impl<QList, MyMovable>(); }
+ void removeFirstGeneral_complex() const { removeFirstGeneral_impl<QList, MyComplex>(); }
+ void removeFirstGeneral_QString() const { removeFirstGeneral_impl<QList, QString>(); }
+
+ // remove from beginning in a special way (using fast part of QList::removeFirst())
+ void removeFirstSpecial_int_data() const { commonBenchmark_data<int>(); }
+ void removeFirstSpecial_primitive_data() const { commonBenchmark_data<MyPrimitive>(); }
+ void removeFirstSpecial_movable_data() const { commonBenchmark_data<MyMovable>(); }
+ void removeFirstSpecial_complex_data() const { commonBenchmark_data<MyComplex>(); }
+ void removeFirstSpecial_QString_data() const { commonBenchmark_data<QString>(); }
+
+ void removeFirstSpecial_int() const { removeFirstSpecial_impl<QList, int>(); }
+ void removeFirstSpecial_primitive() const { removeFirstSpecial_impl<QList, MyPrimitive>(); }
+ void removeFirstSpecial_movable() const { removeFirstSpecial_impl<QList, MyMovable>(); }
+ void removeFirstSpecial_complex() const { removeFirstSpecial_impl<QList, MyComplex>(); }
+ void removeFirstSpecial_QString() const { removeFirstSpecial_impl<QList, QString>(); }
+
+private:
+ template <class T>
+ void removeAll_impl() const;
+
+ template<typename>
+ void commonBenchmark_data(int max = 200000000) const;
+
+ template<template<typename> typename, typename>
+ void appendOne_impl() const;
+
+ template<template<typename> typename, typename>
+ void prependOne_impl() const;
+
+ template<template<typename> typename, typename>
+ void midInsertOne_impl() const;
+
+ template<template<typename> typename, typename>
+ void appendPrependOne_impl() const;
+
+ template<template<typename> typename, typename>
+ void prependAppendHalvesOne_impl() const;
+
+ template<template<typename> typename, typename>
+ void midEmplaceOne_impl() const;
+
+ template<template<typename> typename, typename>
+ void removeFirstGeneral_impl() const;
+
+ template<template<typename> typename, typename>
+ void removeFirstSpecial_impl() const;
+};
+
+template <class T>
+void tst_QList::removeAll_impl() const
+{
+ QFETCH(QList<int>, i10);
+ QFETCH(int, itemsToRemove);
+
+ constexpr int valueToRemove = 5;
+
+ QList<T> list;
+ for (int i = 0; i < 10 * N; ++i) {
+ T t(i10.at(i % 10));
+ list.append(t);
+ }
+
+ T t(valueToRemove);
+
+ qsizetype removedCount = 0; // make compiler happy by setting to 0
+ QList<T> l;
+
+ QBENCHMARK {
+ l = list;
+ removedCount = l.removeAll(t);
+ }
+ 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>("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(int max) const
+{
+ QTest::addColumn<int>("elemCount");
+
+ const auto addRow = [](int count, const char *text) { QTest::newRow(text) << count; };
+
+ const auto p = [](int i, const char *text) { return std::make_pair(i, text); };
+
+ // 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") }) {
+ if (pair.first <= max)
+ addRow(pair.first, pair.second);
+ }
+}
+
+template<template<typename> typename Container, typename T>
+void tst_QList::appendOne_impl() const
+{
+ QFETCH(int, elemCount);
+ constexpr auto getValue = []() { return T {}; };
+
+ QBENCHMARK {
+ Container<T> container;
+ auto lvalue = getValue();
+
+ for (int i = 0; i < elemCount; ++i) {
+ container.append(lvalue);
+ }
+ }
+}
+
+template<template<typename> typename Container, typename T>
+void tst_QList::prependOne_impl() const
+{
+ QFETCH(int, elemCount);
+ constexpr auto getValue = []() { return T {}; };
+
+ QBENCHMARK {
+ Container<T> container;
+ auto lvalue = getValue();
+
+ for (int i = 0; i < elemCount; ++i) {
+ container.prepend(lvalue);
+ }
+ }
+}
+
+template<template<typename> typename Container, typename T>
+void tst_QList::midInsertOne_impl() const
+{
+ QFETCH(int, elemCount);
+ constexpr auto getValue = []() { return T {}; };
+
+ QBENCHMARK {
+ Container<T> container;
+ auto lvalue = getValue();
+
+ for (int i = 0; i < elemCount; ++i) {
+ const int remainder = i % 2;
+ // use insert(i, n, t) as insert(i, t) calls emplace (implementation
+ // detail)
+ container.insert(container.size() / 2 + remainder, 1, lvalue);
+ }
+ }
+}
+
+template<template<typename> typename Container, typename T>
+void tst_QList::appendPrependOne_impl() const
+{
+ QFETCH(int, elemCount);
+ constexpr auto getValue = []() { return T {}; };
+
+ QBENCHMARK {
+ Container<T> container;
+ auto lvalue = getValue();
+
+ for (int i = 0; i < elemCount; ++i) {
+ if (i % 2 == 0) {
+ container.append(lvalue);
+ } else {
+ container.prepend(lvalue);
+ }
+ }
+ }
+}
+
+template<template<typename> typename Container, typename T>
+void tst_QList::prependAppendHalvesOne_impl() const
+{
+ QFETCH(int, elemCount);
+ constexpr auto getValue = []() { return T {}; };
+
+ QBENCHMARK {
+ Container<T> container;
+ auto lvalue = getValue();
+
+ for (int i = 0; i < elemCount / 2; ++i) {
+ container.prepend(lvalue);
+ }
+
+ for (int i = elemCount / 2; i < elemCount; ++i) {
+ container.append(lvalue);
+ }
+ }
+}
+
+template<template<typename> typename Container, typename T>
+void tst_QList::midEmplaceOne_impl() const
+{
+ QFETCH(int, elemCount);
+ constexpr auto getValue = []() { return T {}; };
+
+ QBENCHMARK {
+ Container<T> container;
+ auto lvalue = getValue();
+
+ for (int i = 0; i < elemCount; ++i) {
+ const int remainder = i % 2;
+ container.emplace(container.size() / 2 + remainder, lvalue);
+ }
+ }
+}
+
+template<template<typename> typename Container, typename T>
+void tst_QList::removeFirstGeneral_impl() const
+{
+ QFETCH(int, elemCount);
+ constexpr auto getValue = []() { return T {}; };
+
+ QBENCHMARK {
+ Container<T> container(elemCount, getValue());
+
+ for (int i = 0; i < elemCount - 1; ++i) {
+ container.remove(0, 1);
+ }
+ }
+}
+
+template<template<typename> typename Container, typename T>
+void tst_QList::removeFirstSpecial_impl() const
+{
+ QFETCH(int, elemCount);
+ constexpr auto getValue = []() { return T {}; };
+
+ QBENCHMARK {
+ Container<T> container(elemCount, getValue());
+
+ for (int i = 0; i < elemCount; ++i) {
+ container.removeFirst();
+ }
+ }
+}
+
+QTEST_APPLESS_MAIN(tst_QList)
+
+#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 485e0290f8..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,44 +186,44 @@ 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);
QRect r1(rf1.toRect());
QRect r2(rf2.toRect());
QBENCHMARK {
- r1.intersected(r2);
+ Q_UNUSED(r1.intersected(r2))
}
}
-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);
QRect r1(rf1.toRect());
QRect r2(rf2.toRect());
QBENCHMARK {
- r1.united(r2);
+ Q_UNUSED(r1.united(r2))
}
}
-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,34 +260,34 @@ 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);
QBENCHMARK {
- rf1.intersected(rf2);
+ Q_UNUSED(rf1.intersected(rf2))
}
}
-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);
QBENCHMARK {
- rf1.united(rf2);
+ Q_UNUSED(rf1.united(rf2))
}
}
-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"