Kapitel 5: Erstellen eines Benchmarks
In diesem Kapitel wird gezeigt, wie man mit „ Qt Test “ Benchmarks erstellt.
Erstellen eines Benchmarks
Um einen Benchmark zu erstellen, erweitern wir eine Testfunktion um ein QBENCHMARK-Makro. Eine Benchmark-Testfunktion besteht dann in der Regel aus Einrichtungscode und einem QBENCHMARK-Makro, das den zu messenden Code enthält. Diese Testfunktion misst die Leistung von „ QString::localeAwareCompare()“.
void TestBenchmark::simple()
{
QString str1 = QLatin1String("This is a test string");
QString str2 = QLatin1String("This is a test string");
QCOMPARE(str1.localeAwareCompare(str2), 0);
QBENCHMARK {
str1.localeAwareCompare(str2);
}
}Die Vorbereitung kann am Anfang der Funktion erfolgen. Zu diesem Zeitpunkt läuft die Uhr noch nicht. Der Code innerhalb des QBENCHMARK-Makros wird gemessen und möglicherweise mehrmals wiederholt, um eine genaue Messung zu erhalten.
Es stehen mehrere Backends zur Verfügung, die über die Befehlszeile ausgewählt werden können.
Datenfunktionen
Datenfunktionen sind nützlich für die Erstellung von Benchmarks, die mehrere Dateneingaben vergleichen, beispielsweise einen lokalisierungsbewussten Vergleich mit einem Standardvergleich.
void TestBenchmark::multiple_data()
{
QTest::addColumn<bool>("useLocaleCompare");
QTest::newRow("locale-aware-compare") << true;
QTest::newRow("standard-compare") << false;
}Die Testfunktion nutzt diese Daten dann, um zu bestimmen, was gemessen werden soll.
void TestBenchmark::multiple()
{
QFETCH(bool, useLocaleCompare);
QString str1 = QLatin1String("This is a test string");
QString str2 = QLatin1String("This is a test string");
int result;
if (useLocaleCompare) {
QBENCHMARK {
result = str1.localeAwareCompare(str2);
}
} else {
QBENCHMARK {
result = (str1 == str2);
}
}
Q_UNUSED(result);
}Der Schalter „ if (useLocaleCompare) “ wird außerhalb des QBENCHMARK-Makros platziert, um dessen Overhead nicht mitzumessen. Jede Benchmark-Testfunktion kann ein aktives QBENCHMARK-Makro enthalten.
Erstellen der ausführbaren Datei
Sie können die ausführbare Testdatei mit CMake oder qmake erstellen.
Erstellen mit CMake
Konfigurieren Sie Ihre Build-Einstellungen in Ihrer Datei „CMakeLists.txt“:
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
cmake_minimum_required(VERSION 3.16)
project(tutorial5 LANGUAGES CXX)
find_package(Qt6 REQUIRED COMPONENTS Core Gui Test Widgets)
qt_standard_project_setup()
qt_add_executable(tutorial5
benchmarking.cpp
)
set_target_properties(tutorial5 PROPERTIES
WIN32_EXECUTABLE TRUE
MACOSX_BUNDLE TRUE
)
target_link_libraries(tutorial5 PRIVATE
Qt6::Core
Qt6::Gui
Qt6::Test
Qt6::Widgets
)
install(TARGETS tutorial5
BUNDLE DESTINATION .
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
qt_generate_deploy_app_script(
TARGET tutorial5
OUTPUT_SCRIPT deploy_script
NO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})Führen Sie anschließend über die Befehlszeile entweder „ cmake “ aus oder verwenden Sie das Hilfsskript „ qt-cmake “, das sich unter „ Qt-prefix/<version>/<platform>/bin/qt-cmake “ befindet:
<Qt-prefix>/<version>/<platform>/bin/qt-cmake <source-dir> <build-dir> -G NinjaFühren Sie anschließend Ihr bevorzugtes Generator-Tool aus, um die ausführbare Datei zu erstellen. Hier verwenden wir Ninja:
ninjaErstellen mit qmake
Konfigurieren Sie Ihre Build-Einstellungen in Ihrer Datei „ .pro “:
QT += widgets testlib
SOURCES = benchmarking.cpp
# install
target.path = $$[QT_INSTALL_EXAMPLES]/qtestlib/tutorial5
INSTALLS += targetFühren Sie anschließend „ qmake “ aus und schließlich „ make “, um Ihre ausführbare Datei zu erstellen:
qmake
makeAusführen der ausführbaren Datei
Wenn Sie die resultierende ausführbare Datei ausführen, sollten Sie die folgende Ausgabe erhalten:
********* Start testing of TestBenchmark *********
Config: Using QtTest library %VERSION%, Qt %VERSION%
PASS : TestBenchmark::initTestCase()
PASS : TestBenchmark::simple()
RESULT : TestBenchmark::simple():
0.00030 msecs per iteration (total: 79, iterations: 262144)
PASS : TestBenchmark::multiple(locale-aware-compare)
RESULT : TestBenchmark::multiple():"locale-aware-compare":
0.00029 msecs per iteration (total: 78, iterations: 262144)
.....
PASS : TestBenchmark::series(locale-aware-compare:8001)
RESULT : TestBenchmark::series():"locale-aware-compare:8001":
0.039 msecs per iteration (total: 81, iterations: 2048)
Totals: 15 passed, 0 failed, 0 skipped, 0 blacklisted, 3971ms
********* Finished testing of TestBenchmark *********© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.