第5章:编写基准测试

本章演示如何使用Qt测试编写基准测试。

编写基准测试

要创建基准测试,我们使用QBENCHMARK宏扩展测试函数。然后,基准测试函数通常由设置代码和一个包含要测量的代码的QBENCHMARK宏组成。这个测试函数对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);
    }
}

设置可以在函数开始时完成。此时,时钟没有运行。将测量QBENCHMARK宏内的代码,并可能重复多次以获得准确的度量。

有几个后端可供选择,并且可以在命令行上选择。

数据函数

数据函数对于创建比较多个数据输入的基准测试很有用,例如与标准比较相比的区域感知比较。

void TestBenchmark::multiple_data()
{
    QTest::addColumn<bool>("useLocaleCompare");
    QTest::newRow("locale-aware-compare") << true;
    QTest::newRow("standard-compare") << false;
}

然后,测试函数使用这些数据来确定要基准测试的内容。

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);
}

if (useLocaleCompare)开关放置在QBENCHMARK宏之外,以避免测量其开销。每个基准测试函数可以有一个活动的QBENCHMARK宏。

构建可执行文件

您可以分别使用CMake或qmake构建测试案例的可执行文件。

使用CMake构建

在您的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})

接下来,从命令行运行cmake或使用位于Qt-prefix/<version>/<platform>/bin/qt-cmake的便利脚本qt-cmake

<Qt-prefix>/<version>/<platform>/bin/qt-cmake <source-dir> <build-dir> -G Ninja

然后,运行您首选的生成器工具来构建可执行文件。这里,我们使用Ninja

ninja

使用qmake构建

在您的.pro文件中配置您的构建设置

QT += widgets testlib

SOURCES = benchmarking.cpp

# install
target.path = $$[QT_INSTALL_EXAMPLES]/qtestlib/tutorial5
INSTALLS += target

接下来,运行qmake,最后,运行make以构建您的可执行文件

qmake
make

运行可执行文件

运行生成可执行文件应该为您提供以下输出

********* 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 *********

© 2024 Qt公司有限公司。本文件中包含的文档贡献是相应所有者的版权。本文件提供的文档是根据自由软件基金会发布、版本1.3的GNU自由文档许可协议许可的。Qt及其相应标志是芬兰和/或其他国家的The Qt Company Ltd.的商标。所有其他商标均为其相应所有者的财产。