第5章:ベンチマークの作成
この章では、Qt Test を使用してベンチマークを作成する方法について解説します。
ベンチマークの作成
ベンチマークを作成するには、テスト関数を 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マクロの外側に配置されます。各ベンチマークテスト関数には、1つのアクティブな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を使用しています:
ninjaqmake を使用したビルド
.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 *********© 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.