Kapitel 5: Einen Benchmark schreiben
Dieses Kapitel zeigt, wie man Benchmarks mit Qt Test schreibt.
Einen Benchmark schreiben
Um einen Benchmark zu erstellen, erweitern wir eine Testfunktion mit einem QBENCHMARK-Makro. Eine Benchmark-Testfunktion besteht dann typischerweise aus Setup-Code und einem QBENCHMARK-Makro, das den zu messenden Code enthält. Diese Testfunktion testet 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); } }
Das Setup kann zu Beginn der Funktion durchgeführt werden. 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 in der Befehlszeile ausgewählt werden können.
Daten-Funktionen
Datenfunktionen sind nützlich für die Erstellung von Benchmarks, die mehrere Dateneingaben miteinander vergleichen, z. B. den Vergleich zwischen einer bestimmten Sprachumgebung und dem Standardvergleich.
void TestBenchmark::multiple_data() { QTest::addColumn<bool>("useLocaleCompare"); QTest::newRow("locale-aware-compare") << true; QTest::newRow("standard-compare") << false; }
Die Testfunktion verwendet dann die Daten, um zu bestimmen, was verglichen 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) befindet sich außerhalb des QBENCHMARK-Makros, um dessen Overhead nicht zu messen. Jede Benchmark-Testfunktion kann ein aktives QBENCHMARK-Makro haben.
Erstellen der ausführbaren Datei
Sie können die ausführbare Datei des Testfalls mit CMake oder qmake erstellen.
Erstellen mit CMake
Konfigurieren Sie Ihre Build-Einstellungen in Ihrer CMakeLists.txt-Datei:
# 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 dann von der Befehlszeile aus entweder cmake aus oder verwenden Sie das Skript qt-cmake, das sich in Qt-prefix/<version>/<platform>/bin/qt-cmake befindet:
<Qt-prefix>/<version>/<platform>/bin/qt-cmake <source-dir> <build-dir> -G Ninja
Führen Sie dann Ihr bevorzugtes Generatorwerkzeug aus, um die ausführbare Datei zu erstellen. Hier verwenden wir Ninja:
ninja
Bauen mit qmake
Konfigurieren Sie Ihre Build-Einstellungen in Ihrer .pro Datei:
QT += widgets testlib SOURCES = benchmarking.cpp # install target.path = $$[QT_INSTALL_EXAMPLES]/qtestlib/tutorial5 INSTALLS += target
Führen Sie anschließend qmake und schließlich make aus, um Ihre ausführbare Datei zu erstellen:
qmake make
Ausfü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 *********
© 2025 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.