警告
本节包含自动从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 *********