警告

本节包含自动从C++转换为Python的片段,可能包含错误。

第5章:编写基准测试#

如何编写基准测试。

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

编写基准测试#

创建基准测试时,我们使用QBENCHMARK宏扩展测试函数。然后,基准测试函数通常由设置代码和包含要测量代码的QBENCHMARK宏组成。此测试函数对QString::localeAwareCompare()进行基准测试。

def simple(self):

    str1 = "This is a test string"
    str2 = "This is a test string"
    QCOMPARE(str1.localeAwareCompare(str2), 0)
    QBENCHMARK {
        str1.localeAwareCompare(str2)

设置可以在函数开始时进行。此时,时钟尚未运行。QBENCHMARK宏内的代码将被测量,并且可能重复几次以获得准确测量。

有几个后端可用,并可在命令行中选取。

数据函数#

数据函数对于创建比较多个数据输入的基准测试很有用,例如对locale aware compare与标准compare进行基准测试。

def multiple_data(self):

    QTest.addColumn<bool>("useLocaleCompare")
    QTest.newRow("locale-aware-compare") << True
    QTest.newRow("standard-compare") << False

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

def multiple(self):

    QFETCH(bool, useLocaleCompare)
    str1 = "This is a test string"
    str2 = "This is a test string"
    result = int()
    if useLocaleCompare:
        QBENCHMARK {
            result = str1.localeAwareCompare(str2)

    else:
        QBENCHMARK {
            result = (str1 == str2)


    Q_UNUSED(result)

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

构建可执行文件#

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

使用CMake构建#

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

<Code snippet "/data/qt5-full-670/6.7.0/Src/qtbase/tutorial5/CMakeLists.txt" not found>

然后,从命令行运行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文件中配置您的构建设置

<Code snippet "/data/qt5-full-670/6.7.0/Src/qtbase/tutorial5/tutorial5.pro" not found>

然后,运行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 *********