From 9da3d0db57c30ccc48118fcc323b826291604adf Mon Sep 17 00:00:00 2001 From: Matthias Rauter Date: Fri, 3 Feb 2023 15:31:53 +0100 Subject: Add benchmark example for DeclarativeMapItems Change-Id: I42ec79a55eb16d768a3268212272cd06436d24b9 Reviewed-by: Volker Hilsheimer (cherry picked from commit 854758eaa75fa2b1caf443b9e89c85e362555a06) Reviewed-by: Qt Cherry-pick Bot --- tests/benchmarks/CMakeLists.txt | 4 + .../benchmarks/mapitems_framecount/CMakeLists.txt | 32 +++++ tests/benchmarks/mapitems_framecount/circles.qml | 92 ++++++++++++++ tests/benchmarks/mapitems_framecount/main.cpp | 132 +++++++++++++++++++++ tests/benchmarks/mapitems_framecount/polygons.qml | 103 ++++++++++++++++ tests/benchmarks/mapitems_framecount/polylines.qml | 101 ++++++++++++++++ tests/benchmarks/mapitems_framecount/qml.qrc | 7 ++ .../benchmarks/mapitems_framecount/rectangles.qml | 100 ++++++++++++++++ 8 files changed, 571 insertions(+) create mode 100644 tests/benchmarks/CMakeLists.txt create mode 100644 tests/benchmarks/mapitems_framecount/CMakeLists.txt create mode 100644 tests/benchmarks/mapitems_framecount/circles.qml create mode 100644 tests/benchmarks/mapitems_framecount/main.cpp create mode 100644 tests/benchmarks/mapitems_framecount/polygons.qml create mode 100644 tests/benchmarks/mapitems_framecount/polylines.qml create mode 100644 tests/benchmarks/mapitems_framecount/qml.qrc create mode 100644 tests/benchmarks/mapitems_framecount/rectangles.qml diff --git a/tests/benchmarks/CMakeLists.txt b/tests/benchmarks/CMakeLists.txt new file mode 100644 index 00000000..82015d1d --- /dev/null +++ b/tests/benchmarks/CMakeLists.txt @@ -0,0 +1,4 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +add_subdirectory(mapitems_framecount) diff --git a/tests/benchmarks/mapitems_framecount/CMakeLists.txt b/tests/benchmarks/mapitems_framecount/CMakeLists.txt new file mode 100644 index 00000000..68fee55f --- /dev/null +++ b/tests/benchmarks/mapitems_framecount/CMakeLists.txt @@ -0,0 +1,32 @@ +# Copyright (C) 2023 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS + Widgets QuickWidgets +) + +qt_internal_add_benchmark(mapitems_framecount + GUI + SOURCES + main.cpp + LIBRARIES + Qt::Gui + Qt::Widgets + Qt::Quick + Qt::QuickWidgets +) + +# Resources: +set(qml_resource_files + "circles.qml" + "rectangles.qml" + "polylines.qml" + "polygons.qml" +) + +qt_internal_add_resource(mapitems_framecount "qml" + PREFIX + "/" + FILES + ${qml_resource_files} +) diff --git a/tests/benchmarks/mapitems_framecount/circles.qml b/tests/benchmarks/mapitems_framecount/circles.qml new file mode 100644 index 00000000..0a19248b --- /dev/null +++ b/tests/benchmarks/mapitems_framecount/circles.qml @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2023 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.15 +import QtLocation 5.15 +import QtPositioning 5.15 + +Map { + width: 1024 + height: 1024 + + property double lonPos: 30 + center: QtPositioning.coordinate(0, lonPos) + + NumberAnimation on lonPos + { + loops: Animation.Infinite + from: -180 + to: 180 + duration: 30000 + } + + id: map + plugin: Plugin { + name: "osm" + } + zoomLevel: 1 + copyrightsVisible: false + + Repeater { + id: circles + property var colors: [ + "red", + "orange", + "yellow", + "green", + "blue", + "violet" + ] + property int count: circles.colors.length*5 + model: count*count + MapCircle + { + center + { + longitude: -180+360*(index%circles.count+0.5)/(circles.count) + latitude: -90+180*(Math.floor(index/circles.count)+0.5)/(circles.count) + } + radius: 100 + color: circles.colors[Math.floor(index%circles.colors.length)] + border.width: 2 + autoFadeIn: false + opacity: 0.1 + NumberAnimation on radius + { + loops: Animation.Infinite + from: 100*1000 + to: (Math.PI*6371-100)*1000 + duration: 10000 + } + } + } + + Keys.onPressed: (event)=> { + Qt.quit() + } +} diff --git a/tests/benchmarks/mapitems_framecount/main.cpp b/tests/benchmarks/mapitems_framecount/main.cpp new file mode 100644 index 00000000..8d28e8ec --- /dev/null +++ b/tests/benchmarks/mapitems_framecount/main.cpp @@ -0,0 +1,132 @@ +/**************************************************************************** +** +** Copyright (C) 2023 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include + +class TimerWidget : public QQuickWidget +{ + Q_OBJECT +public: + TimerWidget(const QList &scripts, QWidget *parent = nullptr) + : QQuickWidget(parent) + { + qmlFiles = scripts; + QObject::connect(this->quickWindow(), &QQuickWindow::beforeFrameBegin, this, &TimerWidget::startTimer); + QObject::connect(this->quickWindow(), &QQuickWindow::afterFrameEnd, this, &TimerWidget::endTimer); + QObject::connect(this, &TimerWidget::finishedSampleSize, this, &TimerWidget::loadNext); + } + +public slots: + void startTimer() + { + renderStartAt = QTime::currentTime().msecsSinceStartOfDay(); + } + + void endTimer() + { + if (renderStartAt < 0) return; + + const int now = QTime::currentTime().msecsSinceStartOfDay(); + const int renderTime = now-renderStartAt; + + numberOfRenders++; + sumOfRenderTime += renderTime; + + qInfo() << " Rendering took" << renderTime << "msec. Average:" << sumOfRenderTime/numberOfRenders << "msec (sample size:" << numberOfRenders << ")"; + + renderStartAt = -1; + + if (numberOfRenders >= runSampleSize) + { + executionDuration.insert(currentScript, sumOfRenderTime); + emit finishedSampleSize(); + } + } + + void loadNext() + { + if (qmlFiles.isEmpty()) + { + writeResult(); + return; + } + currentScript = qmlFiles.takeFirst(); + numberOfRenders = 0; + sumOfRenderTime = 0; + QUrl url(currentScript); + setSource(url); + } + + void runScripts() + { + loadNext(); + } + + void writeResult() + { + for (const auto &i : executionDuration.keys()) + { + qInfo() << "Render duration for" << runSampleSize << "Frames of script" << i << ":" << executionDuration[i] << "msec."; + } + this->deleteLater(); + QApplication::exit(0); + } + +signals: + void finishedSampleSize(); + +private: + int runSampleSize = 100; + int renderStartAt = -1; + int sumOfRenderTime = 0; + int numberOfRenders = 0; + + QString currentScript; + QList qmlFiles; + QMap executionDuration; +}; + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + + TimerWidget *w = new TimerWidget({ + "qrc:/circles.qml", + "qrc:/rectangles.qml", + "qrc:/polylines.qml", + "qrc:/polygons.qml" + }); + w->show(); + w->runScripts(); + return a.exec(); +} + +#include "main.moc" diff --git a/tests/benchmarks/mapitems_framecount/polygons.qml b/tests/benchmarks/mapitems_framecount/polygons.qml new file mode 100644 index 00000000..7b57fc5e --- /dev/null +++ b/tests/benchmarks/mapitems_framecount/polygons.qml @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 2023 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.15 +import QtLocation 5.15 +import QtPositioning 5.15 + +Map { + width: 1024 + height: 1024 + + property double lonPos: 30 + center: QtPositioning.coordinate(0, lonPos) + + NumberAnimation on lonPos + { + loops: Animation.Infinite + from: -180 + to: 180 + duration: 30000 + } + + id: map + plugin: Plugin { + name: "osm" + } + zoomLevel: 1 + copyrightsVisible: false + + Repeater { + id: polylines + property var colors: [ + "red", + "orange", + "yellow", + "green", + "blue", + "violet" + ] + property int count: polylines.colors.length*10 + model: count*count + MapPolygon { + color: polylines.colors[Math.floor(index%polylines.colors.length)] + autoFadeIn: false + property double center_longitude: -180+360*(index%polylines.count+0.5)/(polylines.count) + property double center_latitude: -90+180*(Math.floor(index/polylines.count)+0.5)/(polylines.count) + property double a: 1 + geoShape: QtPositioning.polygon( + [ + QtPositioning.coordinate(a*center_latitude + 1.11, a*center_longitude + -3.13), + QtPositioning.coordinate(a*center_latitude + 0.42, a*center_longitude + 10.54), + QtPositioning.coordinate(a*center_latitude + 8.36, a*center_longitude + 6.70) + ], + [ + [ + QtPositioning.coordinate(a*center_latitude + 4.36, a*center_longitude + 3.46), + QtPositioning.coordinate(a*center_latitude + 1.91, a*center_longitude + 0.52), + QtPositioning.coordinate(a*center_latitude + 1.50, a*center_longitude + 8.25), + QtPositioning.coordinate(a*center_latitude + 4.36, a*center_longitude + 6.80) + ] + ] + ) + opacity: 0.5 + NumberAnimation on a + { + loops: Animation.Infinite + from: 0 + to: 1 + duration: 10000 + } + } + } + + Keys.onPressed: (event)=> { + Qt.quit() + } +} + diff --git a/tests/benchmarks/mapitems_framecount/polylines.qml b/tests/benchmarks/mapitems_framecount/polylines.qml new file mode 100644 index 00000000..32b04813 --- /dev/null +++ b/tests/benchmarks/mapitems_framecount/polylines.qml @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** Copyright (C) 2023 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.15 +import QtLocation 5.15 +import QtPositioning 5.15 + +Map { + width: 1024 + height: 1024 + + property double lonPos: 30 + center: QtPositioning.coordinate(0, lonPos) + + NumberAnimation on lonPos + { + loops: Animation.Infinite + from: -180 + to: 180 + duration: 30000 + } + + id: map + plugin: Plugin { + name: "osm" + } + zoomLevel: 1 + copyrightsVisible: false + + Repeater { + id: polylines + property var colors: [ + "red", + "orange", + "yellow", + "green", + "blue", + "violet" + ] + property int count: polylines.colors.length*10 + model: count*count + MapPolyline + { + property double center_longitude: -180+360*(index%polylines.count+0.5)/(polylines.count) + property double center_latitude: -90+180*(Math.floor(index/polylines.count)+0.5)/(polylines.count) + property double a: 1 + path: [ + QtPositioning.coordinate(Math.min(90, Math.max(-90, a*center_latitude-a*40)), + Math.min(180, Math.max(-180, a*center_longitude-a*40))), + QtPositioning.coordinate(Math.min(90, Math.max(-90, a*center_latitude+a*40)), + Math.min(180, Math.max(-180, a*center_longitude-a*40))), + QtPositioning.coordinate(Math.min(90, Math.max(-90, a*center_latitude+a*40)), + Math.min(180, Math.max(-180, a*center_longitude+a*40))), + QtPositioning.coordinate(Math.min(90, Math.max(-90, a*center_latitude-a*40)), + Math.min(180, Math.max(-180, a*center_longitude+a*80))) + ] + line.color: polylines.colors[Math.floor(index%polylines.colors.length)] + line.width: 2 + autoFadeIn: false + opacity: 0.5 + NumberAnimation on a + { + loops: Animation.Infinite + from: 0 + to: 1 + duration: 10000 + } + } + } + + + + Keys.onPressed: (event)=> { + Qt.quit() + } +} diff --git a/tests/benchmarks/mapitems_framecount/qml.qrc b/tests/benchmarks/mapitems_framecount/qml.qrc new file mode 100644 index 00000000..46359c46 --- /dev/null +++ b/tests/benchmarks/mapitems_framecount/qml.qrc @@ -0,0 +1,7 @@ + + + circles.qml + polylines.qml + rectangles.qml + + diff --git a/tests/benchmarks/mapitems_framecount/rectangles.qml b/tests/benchmarks/mapitems_framecount/rectangles.qml new file mode 100644 index 00000000..3ffb5607 --- /dev/null +++ b/tests/benchmarks/mapitems_framecount/rectangles.qml @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Copyright (C) 2023 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.15 +import QtLocation 5.15 +import QtPositioning 5.15 + +Map { + width: 1024 + height: 1024 + + property double lonPos: 30 + center: QtPositioning.coordinate(0, lonPos) + + NumberAnimation on lonPos + { + loops: Animation.Infinite + from: -180 + to: 180 + duration: 30000 + } + + id: map + plugin: Plugin { + name: "osm" + } + zoomLevel: 1 + copyrightsVisible: false + + Repeater { + id: rectangles + property var colors: [ + "red", + "orange", + "yellow", + "green", + "blue", + "violet" + ] + property int count: rectangles.colors.length*4 + model: count*count + MapRectangle + { + property double center_longitude: -180+360*(index%rectangles.count+0.5)/(rectangles.count) + property double center_latitude: -90+180*(Math.floor(index/rectangles.count)+0.5)/(rectangles.count) + property double a: 1 + + topLeft + { + longitude: Math.min(180, Math.max(-180, center_longitude - a/2)) + latitude: Math.min(90, Math.max(-90, center_latitude - a/2)) + } + bottomRight + { + longitude: Math.min(180, Math.max(-180, center_longitude + a/2)) + latitude: Math.min(90, Math.max(-90, center_latitude + a/2)) + } + color: rectangles.colors[Math.floor(index%rectangles.colors.length)] + border.width: 2 + autoFadeIn: false + opacity: 0.1 + NumberAnimation on a + { + loops: Animation.Infinite + from: 1 + to: 80 + duration: 10000 + } + } + } + + Keys.onPressed: (event)=> { + Qt.quit() + } +} -- cgit v1.2.3