第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 マクロの外に置かれます。各ベンチマークテスト関数はアクティブなQBENCHMARKマクロを1つ持つことができます。
実行ファイルのビルド
テストケースの実行ファイルは 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 *********
© 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.