diff --git a/tests/benchmarks/CMakeLists.txt b/tests/benchmarks/CMakeLists.txt new file mode 100644 index 00000000..ec12ac53 --- /dev/null +++ b/tests/benchmarks/CMakeLists.txt @@ -0,0 +1,4 @@ +# Copyright (C) 2024 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +add_subdirectory(protobuf) diff --git a/tests/benchmarks/protobuf/CMakeLists.txt b/tests/benchmarks/protobuf/CMakeLists.txt new file mode 100644 index 00000000..7dc3c463 --- /dev/null +++ b/tests/benchmarks/protobuf/CMakeLists.txt @@ -0,0 +1,4 @@ +# Copyright (C) 2024 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +add_subdirectory(deserialize) diff --git a/tests/benchmarks/protobuf/deserialize/CMakeLists.txt b/tests/benchmarks/protobuf/deserialize/CMakeLists.txt new file mode 100644 index 00000000..6cd3e07c --- /dev/null +++ b/tests/benchmarks/protobuf/deserialize/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (C) 2024 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +qt_internal_add_benchmark(tst_bench_deserialize_protobuf + SOURCES + tst_bench_deserialize_protobuf.cpp + INCLUDE_DIRECTORIES + . + LIBRARIES + Qt::Test + Qt::Protobuf +) + +qt6_add_protobuf(tst_bench_deserialize_protobuf + PROTO_FILES + data/bench.proto + OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/qt_protobuf_generated" +) diff --git a/tests/benchmarks/protobuf/deserialize/data/bench.proto b/tests/benchmarks/protobuf/deserialize/data/bench.proto new file mode 100644 index 00000000..0cbf622b --- /dev/null +++ b/tests/benchmarks/protobuf/deserialize/data/bench.proto @@ -0,0 +1,21 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +syntax = "proto3"; + +package qtbench; + +message EmptyMessage {} + +message SimpleBoolMessage { + bool testFieldBool = 1; +} + +message SimpleBytesMessage { + bytes testFieldBytes = 1; +} + +message RecursiveMessage { + int32 testFieldInt = 1; + RecursiveMessage testFieldRecursive = 2; +} diff --git a/tests/benchmarks/protobuf/deserialize/tst_bench_deserialize_protobuf.cpp b/tests/benchmarks/protobuf/deserialize/tst_bench_deserialize_protobuf.cpp new file mode 100644 index 00000000..cf590ad6 --- /dev/null +++ b/tests/benchmarks/protobuf/deserialize/tst_bench_deserialize_protobuf.cpp @@ -0,0 +1,49 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include + +#include + +#include "bench.qpb.h" + +class tst_ProtoDeserialize : public QObject +{ + Q_OBJECT + +private slots: + void deserialize_data(); + void deserialize(); +}; + +std::array, 3> data = { + std::make_pair("qtbench.SimpleBoolMessage", QByteArray::fromHex("0801")), + std::make_pair("qtbench.SimpleBytesMessage", QByteArray::fromHex("0a0c48656c6c6f20776f726c6421")), + std::make_pair("qtbench.RecursiveMessage", QByteArray::fromHex("080112120802120e0803120a08041206080512020806")), +}; + +void tst_ProtoDeserialize::deserialize_data() +{ + QTest::addColumn("name"); + QTest::addColumn("data"); + + for (auto &&[name, value] : data) + QTest::newRow(qPrintable(name)) << name << value; +} + +void tst_ProtoDeserialize::deserialize() +{ + QFETCH(QString, name); + QFETCH(QByteArray, data); + + QProtobufSerializer serializer; + QBENCHMARK { + QProtobufMessagePointer res = QProtobufMessage::constructByName(name); + QVERIFY(res); + QVERIFY(res->deserialize(&serializer, data)); + } +} + +QTEST_MAIN(tst_ProtoDeserialize) + +#include "tst_bench_deserialize_protobuf.moc"