From f95c4e304dc3a6cc38b96d1d35ec98e9731d472a Mon Sep 17 00:00:00 2001 From: "Denis V. Dedkov" Date: Tue, 25 Apr 2023 13:39:14 +0200 Subject: [PATCH] Benchmark page was added --- CMakeLists.txt | 1 + main.cpp | 2 + qml/Views/BenchmarkView.qml | 96 +++++++++++++++++++ qml/main.qml | 5 + qml/qml.qrc | 1 + viewmodels/benchmarkviewmodel.cpp | 150 ++++++++++++++++++++++++++++++ viewmodels/benchmarkviewmodel.h | 54 +++++++++++ 7 files changed, 309 insertions(+) create mode 100644 qml/Views/BenchmarkView.qml create mode 100644 viewmodels/benchmarkviewmodel.cpp create mode 100644 viewmodels/benchmarkviewmodel.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 75606da..022ad36 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,7 @@ set(PROJECT_SOURCES viewmodels/ordersviewmodel.h viewmodels/ordersviewmodel.cpp viewmodels/settingsviewmodel.h viewmodels/settingsviewmodel.cpp viewmodels/restsviewmodel.h viewmodels/restsviewmodel.cpp + viewmodels/benchmarkviewmodel.h viewmodels/benchmarkviewmodel.cpp services/beerservice.h services/beerservice.cpp services/settingsservice.h services/settingsservice.cpp services/modelsregister.h services/modelsregister.cpp diff --git a/main.cpp b/main.cpp index 19b91af..6f77f7e 100644 --- a/main.cpp +++ b/main.cpp @@ -14,6 +14,7 @@ #include "viewmodels/storesviewmodel.h" #include "viewmodels/restsviewmodel.h" #include "viewmodels/settingsviewmodel.h" +#include "viewmodels/benchmarkviewmodel.h" #include "services/beerservice.h" #include "services/modelsregister.h" @@ -56,6 +57,7 @@ int main(int argc, char *argv[]) qmlRegisterType("ru.ded.beerlog", 1, 0, "StoresViewModel"); qmlRegisterType("ru.ded.beerlog", 1, 0, "RestsViewModel"); qmlRegisterType("ru.ded.beerlog", 1, 0, "SettingsViewModel"); + qmlRegisterType("ru.ded.beerlog", 1, 0, "BenchmarkViewModel"); engine.load(url); diff --git a/qml/Views/BenchmarkView.qml b/qml/Views/BenchmarkView.qml new file mode 100644 index 0000000..48c93e0 --- /dev/null +++ b/qml/Views/BenchmarkView.qml @@ -0,0 +1,96 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +import ru.ded.beerlog 1.0 + +Page { + + title: qsTr("Benchmark") + + Column { + anchors.fill: parent + anchors.margins: 10 + + ItemDelegate { + width: parent.width + + text: qsTr("Items count") + + TextField { + id: itemsCountField + + anchors.right: parent.right + + validator: IntValidator { + bottom: 0 + top: 100000 + } + + height: parent.height + + inputMethodHints: Qt.ImhPreferNumbers + } + } + + ItemDelegate { + width: parent.width + + text: qsTr("Submit time") + + Label { + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + text: benchmark.submitTime + } + } + + ItemDelegate { + width: parent.width + + text: qsTr("Receive time") + + Label { + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + text: benchmark.receiveTime + } + } + + ItemDelegate { + width: parent.width + + text: qsTr("Remove time") + + Label { + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + text: benchmark.removeTime + } + } + + ItemDelegate { + id: startButton + + width: parent.width + + text: qsTr("Start benchmark") + enabled: !benchmark.inProgress + + onClicked: benchmark.startBenchmark() + + states: State { + when: benchmark.inProgress + PropertyChanges { + target: startButton + text: qsTr("In progress") + } + } + } + } + + BenchmarkViewModel { + id: benchmark + + itemsCount: Number(itemsCountField.text) + } +} diff --git a/qml/main.qml b/qml/main.qml index 54bca75..0d054b0 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -85,6 +85,7 @@ ApplicationWindow { "orders": () => { stackView.openPage("Views/OrdersView.qml") }, "rests": () => { stackView.openPage("Views/RestsView.qml") }, "settings": () => { stackView.openPage("Views/SettingsView.qml") }, + "benchmark": () => { stackView.openPage("Views/BenchmarkView.qml") }, "quit": () => { Qt.quit() } } @@ -108,6 +109,10 @@ ApplicationWindow { title: qsTr("Settings") action: "settings" } + ListElement { + title: qsTr("Benchmark") + action: "benchmark" + } ListElement { title: qsTr("Quit") action: "quit" diff --git a/qml/qml.qrc b/qml/qml.qrc index 41da06f..aa0ce2c 100644 --- a/qml/qml.qrc +++ b/qml/qml.qrc @@ -7,5 +7,6 @@ Views/SettingsView.qml Views/ProductsView.qml Views/RestsView.qml + Views/BenchmarkView.qml diff --git a/viewmodels/benchmarkviewmodel.cpp b/viewmodels/benchmarkviewmodel.cpp new file mode 100644 index 0000000..6654888 --- /dev/null +++ b/viewmodels/benchmarkviewmodel.cpp @@ -0,0 +1,150 @@ +#include "benchmarkviewmodel.h" + +#include +#include + +#include "models/basemodel.h" + +BenchmarkViewModel::BenchmarkViewModel(QObject *parent) : QObject{parent} +{ +} + +void BenchmarkViewModel::startBenchmark() +{ + setInProgress(true); + submitBenchmark(); + receiveAndDeleteBenchmark(); + setInProgress(false); +} + +int BenchmarkViewModel::itemsCount() const +{ + return m_itemsCount; +} + +void BenchmarkViewModel::setItemsCount(int newItemsCount) +{ + if (m_itemsCount == newItemsCount) { + return; + } + + m_itemsCount = newItemsCount; + emit itemsCountChanged(); +} + +quint64 BenchmarkViewModel::submitTime() const +{ + return m_submitTime; +} + +void BenchmarkViewModel::setSubmitTime(quint64 newSubmitTime) +{ + if (m_submitTime == newSubmitTime) { + return; + } + + m_submitTime = newSubmitTime; + emit submitTimeChanged(); +} + +quint64 BenchmarkViewModel::receiveTime() const +{ + return m_receiveTime; +} + +void BenchmarkViewModel::setReceiveTime(quint64 newReceiveTime) +{ + if (m_receiveTime == newReceiveTime) { + return; + } + + m_receiveTime = newReceiveTime; + emit receiveTimeChanged(); +} + +quint64 BenchmarkViewModel::removeTime() const +{ + return m_removeTime; +} + +void BenchmarkViewModel::setRemoveTime(quint64 newRemoveTime) +{ + if (m_removeTime == newRemoveTime) { + return; + } + + m_removeTime = newRemoveTime; + emit removeTimeChanged(); +} + +void BenchmarkViewModel::submitBenchmark() +{ + BaseModel benchModel("benchmark"); + + QEventLoop loop; + int callCount = m_itemsCount; + connect(&benchModel, &BaseModel::dataChanged, this, [&loop, &callCount] { + if (--callCount == 0) { + loop.quit(); + } + }); + + QElapsedTimer timer; + timer.start(); + for (int i = 0; i < m_itemsCount; ++i) { + benchModel.submitItem(QVariantMap {{ "name", QString("Item %1").arg(i) }}); + } + + loop.exec(); + setSubmitTime(timer.elapsed()); +} + +void BenchmarkViewModel::receiveAndDeleteBenchmark() +{ + QEventLoop loop; + QElapsedTimer timer; + timer.start(); + BaseModel benchModel("benchmark"); + connect(&benchModel, &BaseModel::dataChanged, this, [&loop]() { + loop.quit(); + }); + + loop.exec(); + setReceiveTime(timer.elapsed()); + + disconnect(&benchModel, &BaseModel::dataChanged, this, nullptr); + + QStringList itemIdList; + for (const QVariant &item : benchModel.items()) { + itemIdList << item.toMap().value("id").toString(); + } + int callCount = itemIdList.count(); + connect(&benchModel, &BaseModel::dataChanged, this, [&loop, &callCount]() { + if (--callCount == 0) { + loop.quit(); + } + }); + + timer.restart(); + for (const QString &itemId : itemIdList) { + benchModel.deleteItem(itemId); + } + + loop.exec(); + setRemoveTime(timer.elapsed()); +} + +bool BenchmarkViewModel::inProgress() const +{ + return m_inProgress; +} + +void BenchmarkViewModel::setInProgress(bool newInProgress) +{ + if (m_inProgress == newInProgress) { + return; + } + + m_inProgress = newInProgress; + emit inProgressChanged(); +} diff --git a/viewmodels/benchmarkviewmodel.h b/viewmodels/benchmarkviewmodel.h new file mode 100644 index 0000000..360e281 --- /dev/null +++ b/viewmodels/benchmarkviewmodel.h @@ -0,0 +1,54 @@ +#ifndef BENCHMARKVIEWMODEL_H +#define BENCHMARKVIEWMODEL_H + +#include + +class BenchmarkViewModel : public QObject +{ + Q_OBJECT + + Q_PROPERTY(int itemsCount READ itemsCount WRITE setItemsCount NOTIFY itemsCountChanged) + Q_PROPERTY(quint64 submitTime READ submitTime WRITE setSubmitTime NOTIFY submitTimeChanged) + Q_PROPERTY(quint64 receiveTime READ receiveTime WRITE setReceiveTime NOTIFY receiveTimeChanged) + Q_PROPERTY(quint64 removeTime READ removeTime WRITE setRemoveTime NOTIFY removeTimeChanged) + Q_PROPERTY(bool inProgress READ inProgress WRITE setInProgress NOTIFY inProgressChanged) + +public: + explicit BenchmarkViewModel(QObject *parent = nullptr); + + Q_INVOKABLE void startBenchmark(); + + int itemsCount() const; + void setItemsCount(int newItemsCount); + + quint64 submitTime() const; + void setSubmitTime(quint64 newSubmitTime); + + quint64 receiveTime() const; + void setReceiveTime(quint64 newReceiveTime); + + quint64 removeTime() const; + void setRemoveTime(quint64 newRemoveTime); + + bool inProgress() const; + void setInProgress(bool newInProgress); + +signals: + void itemsCountChanged(); + void submitTimeChanged(); + void receiveTimeChanged(); + void removeTimeChanged(); + void inProgressChanged(); + +private: + void submitBenchmark(); + void receiveAndDeleteBenchmark(); + + int m_itemsCount = 0; + quint64 m_submitTime = 0; + quint64 m_receiveTime = 0; + quint64 m_removeTime = 0; + bool m_inProgress = false; +}; + +#endif // BENCHMARKVIEWMODEL_H