Kapitel 5: Schreiben eines Benchmarks
In diesem Kapitel wird gezeigt, wie man mit Qt Test Benchmarks schreibt.
Schreiben eines Benchmarks
Um einen Benchmark zu erstellen, erweitern wir eine Testfunktion um ein QBENCHMARK-Makro. Eine Benchmark-Testfunktion besteht dann typischerweise aus Setup-Code und einem QBENCHMARK-Makro, das den zu messenden Code enthält. Diese Testfunktion vergleicht 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.
Datenfunktionen
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.