Capítulo 5: Cómo escribir un benchmark
Este capítulo muestra cómo escribir puntos de referencia utilizando Qt Test.
Creación de un benchmark
Para crear un benchmark extendemos una función de prueba con una macro QBENCHMARK. Una función de prueba de benchmark consistirá típicamente en un código de configuración y una macro QBENCHMARK que contiene el código a medir. Esta función de prueba mide 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 configuración puede hacerse al principio de la función. En este punto, el reloj no está funcionando. El código dentro de la macro QBENCHMARK será medido, y posiblemente repetido varias veces para obtener una medición precisa.
Existen varios back-ends disponibles que pueden seleccionarse en la línea de comandos.
Funciones de datos
Las funciones de datos son útiles para crear pruebas comparativas que comparen varias entradas de datos, por ejemplo la comparación consciente de la configuración regional frente a la comparación estándar.
void TestBenchmark::multiple_data() { QTest::addColumn<bool>("useLocaleCompare"); QTest::newRow("locale-aware-compare") << true; QTest::newRow("standard-compare") << false; }
La función de prueba utiliza los datos para determinar qué comparar.
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); }
El interruptor if (useLocaleCompare) se coloca fuera de la macro QBENCHMARK para evitar medir su sobrecarga. Cada función de prueba puede tener una macro QBENCHMARK activa.
Creación del ejecutable
Puede construir el ejecutable del caso de prueba utilizando CMake o qmake.
Construir con CMake
Configure sus ajustes de construcción en su archivo 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})A continuación, desde la línea de comandos, ejecute cmake o utilice el script de conveniencia qt-cmake ubicado en Qt-prefix/<version>/<platform>/bin/qt-cmake:
<Qt-prefix>/<version>/<platform>/bin/qt-cmake <source-dir> <build-dir> -G Ninja
A continuación, ejecute su herramienta generadora preferida para construir el ejecutable. Aquí, estamos usando Ninja:
ninja
Compilación con qmake
Configura los parámetros de compilación en tu archivo .pro:
QT += widgets testlib SOURCES = benchmarking.cpp # install target.path = $$[QT_INSTALL_EXAMPLES]/qtestlib/tutorial5 INSTALLS += target
A continuación, ejecuta qmake y, por último, ejecuta make para crear el ejecutable:
qmake make
Ejecutar el ejecutable
Ejecutando el ejecutable resultante debería obtener la siguiente salida:
********* 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.