From 166d864f5e55b146ad2eef8db59b4eaec38b41c0 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 16 Feb 2016 18:22:21 +0100 Subject: Pipeline benchmark --- hawd_defs/pipeline | 9 +++ tests/CMakeLists.txt | 1 + tests/pipelinebenchmark.cpp | 151 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 161 insertions(+) create mode 100644 hawd_defs/pipeline create mode 100644 tests/pipelinebenchmark.cpp diff --git a/hawd_defs/pipeline b/hawd_defs/pipeline new file mode 100644 index 0000000..1998d8c --- /dev/null +++ b/hawd_defs/pipeline @@ -0,0 +1,9 @@ +{ + "name": "Pipeline write", + "description": "Measures performance of the Pipeline", + "columns": { + "rows": { "type": "int" }, + "append": { "type": "float", "unit": "ops/ms" }, + "total": { "type": "float", "unit": "ops/ms" } + } +} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 2aa56d4..8045f59 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -34,6 +34,7 @@ manual_tests ( dummyresourcebenchmark # genericresourcebenchmark mailquerybenchmark + pipelinebenchmark # genericfacadebenchmark ) diff --git a/tests/pipelinebenchmark.cpp b/tests/pipelinebenchmark.cpp new file mode 100644 index 0000000..c0c5cb1 --- /dev/null +++ b/tests/pipelinebenchmark.cpp @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2016 Christian Mollekopf + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) version 3, or any + * later version accepted by the membership of KDE e.V. (or its + * successor approved by the membership of KDE e.V.), which shall + * act as a proxy defined in Section 6 of version 3 of the license. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + */ +#include + +#include + +#include "testimplementations.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hawd/dataset.h" +#include "hawd/formatter.h" + +#include +#include + +#include "mail_generated.h" +#include "createentity_generated.h" +#include "getrssusage.h" + +// class IndexUpdater : public Sink::Preprocessor { +// public: +// void newEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &newEntity, Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE +// { +// for (int i = 0; i < 10; i++) { +// Index ridIndex(QString("index.index%1").arg(i).toLatin1(), transaction); +// ridIndex.add("foo", uid); +// } +// } +// +// void modifiedEntity(const QByteArray &key, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, const Sink::ApplicationDomain::BufferAdaptor &newEntity, Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE +// { +// } +// +// void deletedEntity(const QByteArray &key, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE +// { +// } +// }; +// + +/** + * Benchmark pipeline processing speed. + * + * This benchmark especially highlights: + * * Cost of an index in speed and size + */ +class PipelineBenchmark : public QObject +{ + Q_OBJECT + + QByteArray resourceIdentifier; + HAWD::State mHawdState; + + void populateDatabase(int count, const QVector &preprocessors) + { + TestResource::removeFromDisk(resourceIdentifier); + + auto pipeline = QSharedPointer::create(resourceIdentifier); + + auto mailFactory = QSharedPointer::create(); + pipeline->setPreprocessors("mail", preprocessors); + pipeline->setAdaptorFactory("mail", mailFactory); + + QTime time; + time.start(); + + auto domainTypeAdaptorFactory = QSharedPointer::create(); + + pipeline->startTransaction(); + const auto date = QDateTime::currentDateTimeUtc(); + for (int i = 0; i < count; i++) { + auto domainObject = Sink::ApplicationDomain::Mail::Ptr::create(); + domainObject->setProperty("uid", "uid"); + domainObject->setProperty("subject", QString("subject%1").arg(i)); + domainObject->setProperty("date", date.addSecs(count)); + domainObject->setProperty("folder", "folder1"); + // domainObject->setProperty("attachment", attachment); + const auto command = createCommand(*domainObject, *domainTypeAdaptorFactory); + pipeline->newEntity(command.data(), command.size()); + } + pipeline->commit(); + auto appendTime = time.elapsed(); + + auto allProcessedTime = time.elapsed(); + + // Print memory layout, RSS is what is in memory + // std::system("exec pmap -x \"$PPID\""); + // + std::cout << "Size: " << Sink::Storage(Sink::storageLocation(), resourceIdentifier, Sink::Storage::ReadOnly).diskUsage()/1024 << " [kb]" << std::endl; + std::cout << "Time: " << allProcessedTime << " [ms]" << std::endl; + + HAWD::Dataset dataset("pipeline", mHawdState); + HAWD::Dataset::Row row = dataset.row(); + + row.setValue("rows", count); + row.setValue("append", (qreal)count/appendTime); + row.setValue("total", (qreal)count/allProcessedTime); + dataset.insertRow(row); + HAWD::Formatter::print(dataset); + + } + +private Q_SLOTS: + + void init() + { + Sink::Log::setDebugOutputLevel(Sink::Log::Warning); + resourceIdentifier = "org.kde.test.instance1"; + } + + void testWithoutIndex() + { + populateDatabase(10000, QVector()); + } + + void testWithIndex() + { + auto indexer = QSharedPointer >::create(); + populateDatabase(10000, QVector() << indexer.data()); + } + +}; + +QTEST_MAIN(PipelineBenchmark) +#include "pipelinebenchmark.moc" -- cgit v1.2.3