Chapitre 5 : Écrire un test de performance
Ce chapitre montre comment écrire des tests de performance en utilisant Qt Test.
Ecrire un benchmark
Pour créer un benchmark, nous étendons une fonction de test avec une macro QBENCHMARK. Une fonction de test de benchmark se compose alors typiquement d'un code d'installation et d'une macro QBENCHMARK qui contient le code à mesurer. Cette fonction de test évalue 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); } }
La configuration peut être effectuée au début de la fonction. À ce stade, l'horloge ne fonctionne pas. Le code contenu dans la macro QBENCHMARK sera mesuré, et éventuellement répété plusieurs fois afin d'obtenir une mesure précise.
Plusieurs back-ends sont disponibles et peuvent être sélectionnés sur la ligne de commande.
Fonctions de données
Les fonctions de données sont utiles pour créer des repères qui comparent plusieurs entrées de données, par exemple la comparaison locale consciente par rapport à la comparaison standard.
void TestBenchmark::multiple_data() { QTest::addColumn<bool>("useLocaleCompare"); QTest::newRow("locale-aware-compare") << true; QTest::newRow("standard-compare") << false; }
La fonction de test utilise ensuite les données pour déterminer ce qu'il faut comparer.
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); }
Le commutateur if (useLocaleCompare) est placé à l'extérieur de la macro QBENCHMARK pour éviter de mesurer son surcoût. Chaque fonction de test d'étalonnage peut avoir une macro QBENCHMARK active.
Création de l'exécutable
Vous pouvez construire l'exécutable du scénario de test à l'aide de CMake ou de qmake.
Construction avec CMake
Configurez vos paramètres de compilation dans votre fichier 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})Ensuite, à partir de la ligne de commande, exécutez cmake ou utilisez le script de commodité qt-cmake situé dans Qt-prefix/<version>/<platform>/bin/qt-cmake:
<Qt-prefix>/<version>/<platform>/bin/qt-cmake <source-dir> <build-dir> -G Ninja
Ensuite, lancez votre outil de génération préféré pour construire l'exécutable. Ici, nous utilisons Ninja :
ninja
Construire avec qmake
Configurez vos paramètres de construction dans votre fichier .pro:
QT += widgets testlib SOURCES = benchmarking.cpp # install target.path = $$[QT_INSTALL_EXAMPLES]/qtestlib/tutorial5 INSTALLS += target
Ensuite, exécutez qmake, et enfin, exécutez make pour construire votre exécutable :
qmake make
Exécution de l'exécutable
L'exécution de l'exécutable résultant devrait vous donner la sortie suivante :
********* 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.