このページの内容

第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を使用しています:

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

© 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.