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.