From 1ff0cfa618926e7e680b942a7d7a06edbc54bf9f Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Tue, 17 Feb 2015 01:56:17 +0100 Subject: [PATCH] refs #386, further samples / performance tests * especially impact of find performance on interpolator --- samples/blackmisc/main.cpp | 6 +- samples/blackmisc/samplesperformance.cpp | 159 ++++++++++++++++++----- samples/blackmisc/samplesperformance.h | 10 ++ 3 files changed, 138 insertions(+), 37 deletions(-) diff --git a/samples/blackmisc/main.cpp b/samples/blackmisc/main.cpp index 5d5a20e0f..41dcc5386 100644 --- a/samples/blackmisc/main.cpp +++ b/samples/blackmisc/main.cpp @@ -44,8 +44,9 @@ int main(int argc, char *argv[]) qtout << "4 .. Metadata" << endl; qtout << "5 .. Variant" << endl; qtout << "6a .. Performance create / copy / ..." << endl; - qtout << "6b .. 25/100 Performance impl. type ..." << endl; - qtout << "6c .. 25/20 Performance impl. type ..." << endl; + qtout << "6b .. 25/100 Performance impl. type" << endl; + qtout << "6c .. 25/20 Performance impl. type" << endl; + qtout << "6d .. 40/20 Interpolator scenario" << endl; qtout << "7 .. Algorithms" << endl; qtout << "8 .. Concurrent (thread)" << endl; qtout << "-----" << endl; @@ -60,6 +61,7 @@ int main(int argc, char *argv[]) else if (s.startsWith("6a")) { CSamplesPerformance::samplesMisc(qtout); } else if (s.startsWith("6b")) { CSamplesPerformance::samplesImplementationType(qtout, 25, 100); } else if (s.startsWith("6c")) { CSamplesPerformance::samplesImplementationType(qtout, 25, 20); } + else if (s.startsWith("6d")) { CSamplesPerformance::interpolatorScenario(qtout, 40, 20); } else if (s.startsWith("7")) { CSamplesAlgorithm::samples(); } else if (s.startsWith("8")) { CSamplesConcurrent::samples(s, qtout, qtin); } else if (s.startsWith("x")) { break; } diff --git a/samples/blackmisc/samplesperformance.cpp b/samples/blackmisc/samplesperformance.cpp index 7bdeb32ab..f410d879d 100644 --- a/samples/blackmisc/samplesperformance.cpp +++ b/samples/blackmisc/samplesperformance.cpp @@ -154,22 +154,8 @@ namespace BlackMiscTest int CSamplesPerformance::samplesImplementationType(QTextStream &out, int numberOfCallsigns, int numberOfTimes) { - const QDateTime baseTime = QDateTime::currentDateTimeUtc(); - const qint64 baseTimeEpoch = baseTime.toMSecsSinceEpoch(); - CAircraftSituationList situations; - - for (int cs = 0; cs < numberOfCallsigns; cs++) - { - CCallsign callsign("CS" + QString::number(cs)); - CCoordinateGeodetic coordinate(cs, cs, cs); - CAltitude alt(cs, CAltitude::MeanSeaLevel, CLengthUnit::m()); - for (int t = 0; t < numberOfTimes; t++) - { - CAircraftSituation s(callsign, coordinate, alt); - s.setMSecsSinceEpoch(baseTimeEpoch + 10 * t); - situations.push_back(s); - } - } + const qint64 baseTimeEpoch = QDateTime::currentMSecsSinceEpoch(); + CAircraftSituationList situations = createSituations(baseTimeEpoch, numberOfCallsigns, numberOfTimes); QTime timer; out << "Created " << situations.size() << " situations" << endl; @@ -186,24 +172,12 @@ namespace BlackMiscTest } out << "Reads by callsigns: " << timer.elapsed() << "ms" << endl; - timer.start(); - for (int i = 0; i < 10; i++) - { - QMap splitList = situations.splitPerCallsign(); - Q_ASSERT(splitList.size() == numberOfCallsigns); - for (const CAircraftSituationList &slcs : splitList.values()) - { - Q_ASSERT(slcs.size() == numberOfTimes); - } - } - out << "Reads by callsigns split: " << timer.elapsed() << "ms" << endl; - timer.start(); for (int i = 0; i < 10; i++) { for (int t = 0; t < numberOfTimes; t++) { - CAircraftSituationList r = situations.findBefore(baseTimeEpoch + 1 + (10 * t)); + CAircraftSituationList r = situations.findBefore(baseTimeEpoch + 1 + (DeltaTime * t)); Q_ASSERT(r.size() == numberOfCallsigns * (t + 1)); } } @@ -215,7 +189,7 @@ namespace BlackMiscTest for (int cs = 0; cs < numberOfCallsigns; cs++) { CCallsign callsign("CS" + QString::number(cs)); - CAircraftSituationList r = situations.findByCallsign(callsign).findBefore(baseTimeEpoch + 1 + (10 * t)); + CAircraftSituationList r = situations.findByCallsign(callsign).findBefore(baseTimeEpoch + 1 + (DeltaTime * t)); Q_UNUSED(r); } } @@ -227,20 +201,20 @@ namespace BlackMiscTest for (int cs = 0; cs < numberOfCallsigns; cs++) { CCallsign callsign("CS" + QString::number(cs)); - CAircraftSituationList r = situations.findBefore(baseTimeEpoch + 1 + (10 * t)).findByCallsign(callsign); + CAircraftSituationList r = situations.findBefore(baseTimeEpoch + 1 + (DeltaTime * t)).findByCallsign(callsign); Q_UNUSED(r); } } out << "Reads by times / callsigns: " << timer.elapsed() << "ms" << endl; timer.start(); + QMap splitList = situations.splitPerCallsign(); + Q_ASSERT(splitList.size() == numberOfCallsigns); for (int t = 0; t < numberOfTimes; t++) { - QMap splitList = situations.splitPerCallsign(); - Q_ASSERT(splitList.size() == numberOfCallsigns); for (const CAircraftSituationList &slcs : splitList.values()) { - CAircraftSituationList r = slcs.findBefore(baseTimeEpoch + 1 + (10 * t)); + CAircraftSituationList r = slcs.findBefore(baseTimeEpoch + 1 + (DeltaTime * t)); Q_UNUSED(r); } } @@ -265,7 +239,7 @@ namespace BlackMiscTest { for (int t = 0; t < numberOfTimes; t++) { - CAircraftSituationList r = situations.findBefore(baseTimeEpoch + 1 + (10 * t)); + CAircraftSituationList r = situations.findBefore(baseTimeEpoch + 1 + (DeltaTime * t)); Q_ASSERT(r.size() == numberOfCallsigns * (t + 1)); } } @@ -273,4 +247,119 @@ namespace BlackMiscTest return 0; } + int CSamplesPerformance::interpolatorScenario(QTextStream &out, int numberOfCallsigns, int numberOfTimes) + { + const qint64 baseTimeEpoch = QDateTime::currentMSecsSinceEpoch(); + CAircraftSituationList situations = createSituations(baseTimeEpoch, numberOfCallsigns, numberOfTimes); + CAircraftSituationList situationsBefore; + CAircraftSituationList situationsAfter; + + qint64 halfTime = baseTimeEpoch + DeltaTime * numberOfTimes / 2; + + QTime timer; + timer.start(); + for (int cs = 0; cs < numberOfCallsigns; cs++) + { + CCallsign callsign("CS" + QString::number(cs)); + situationsBefore = situations.findBefore(halfTime).findByCallsign(callsign); + situationsAfter = situations.findAfter(halfTime - 1).findByCallsign(callsign); + } + out << "Reads by time, callsigns: " << timer.elapsed() << "ms" << endl; + + timer.start(); + situationsBefore = situations.findBefore(halfTime); + situationsAfter = situations.findAfter(halfTime - 1); + for (int cs = 0; cs < numberOfCallsigns; cs++) + { + CCallsign callsign("CS" + QString::number(cs)); + CAircraftSituationList csSituationsBefore = situationsBefore.findByCallsign(callsign); + CAircraftSituationList csSituationsAfter = situationsAfter.findByCallsign(callsign); + Q_UNUSED(csSituationsBefore); + Q_UNUSED(csSituationsAfter); + } + out << "Split by time upfront, then callsigns: " << timer.elapsed() << "ms" << endl; + int b = situationsBefore.size(); + int a = situationsAfter.size(); + Q_ASSERT(a + b == numberOfTimes * numberOfCallsigns); + + timer.start(); + QList split = situations.splitByTime(halfTime); + for (int cs = 0; cs < numberOfCallsigns; cs++) + { + CCallsign callsign("CS" + QString::number(cs)); + CAircraftSituationList csSituationsBefore = split[0].findByCallsign(callsign); + CAircraftSituationList csSituationsAfter = split[1].findByCallsign(callsign); + Q_UNUSED(csSituationsBefore); + Q_UNUSED(csSituationsAfter); + } + out << "Single split by time upfront, then callsigns: " << timer.elapsed() << "ms" << endl; + b = split[0].size(); + a = split[1].size(); + Q_ASSERT(a + b == numberOfTimes * numberOfCallsigns); + + situations.sortLatestFirst(); // eliminate impact of sort + timer.start(); + split = situations.splitByTime(halfTime); + for (int cs = 0; cs < numberOfCallsigns; cs++) + { + CCallsign callsign("CS" + QString::number(cs)); + CAircraftSituationList csSituationsBefore = split[0].findByCallsign(callsign); + CAircraftSituationList csSituationsAfter = split[1].findByCallsign(callsign); + Q_UNUSED(csSituationsBefore); + Q_UNUSED(csSituationsAfter); + } + out << "Single, pre-sorted split by time upfront, then callsigns: " << timer.elapsed() << "ms" << endl; + + situations.sortOldestFirst(); // eliminate impact of sort + timer.start(); + split = situations.splitByTimeNoSortAscendingTimestamp(halfTime); + for (int cs = 0; cs < numberOfCallsigns; cs++) + { + CCallsign callsign("CS" + QString::number(cs)); + CAircraftSituationList csSituationsBefore = split[0].findByCallsign(callsign); + CAircraftSituationList csSituationsAfter = split[1].findByCallsign(callsign); + Q_UNUSED(csSituationsBefore); + Q_UNUSED(csSituationsAfter); + } + out << "Single, unsorted split by time upfront, then callsigns: " << timer.elapsed() << "ms" << endl; + + timer.start(); + QMap csSituations = situations.splitPerCallsign(); + out << "Split by " << csSituations.size() << " callsigns, " << timer.elapsed() << "ms" << endl; + + timer.start(); + for (const CAircraftSituationList &csl : csSituations.values()) + { + CAircraftSituationList csSituationsBefore = csl.findBefore(halfTime); + CAircraftSituationList csSituationsAfter = csl.findAfter(halfTime - 1); + a = csSituationsBefore.size(); + b = csSituationsAfter.size(); + Q_ASSERT(a + b == numberOfTimes); + Q_UNUSED(csSituationsBefore); + Q_UNUSED(csSituationsAfter); + } + out << "Split by callsign, by time: " << timer.elapsed() << "ms" << endl; + + out << endl; + return 0; + } + + CAircraftSituationList CSamplesPerformance::createSituations(qint64 baseTimeEpoch, int numberOfCallsigns, int numberOfTimes) + { + CAircraftSituationList situations; + for (int cs = 0; cs < numberOfCallsigns; cs++) + { + CCallsign callsign("CS" + QString::number(cs)); + CCoordinateGeodetic coordinate(cs, cs, cs); + CAltitude alt(cs, CAltitude::MeanSeaLevel, CLengthUnit::m()); + for (int t = 0; t < numberOfTimes; t++) + { + CAircraftSituation s(callsign, coordinate, alt); + s.setMSecsSinceEpoch(baseTimeEpoch + DeltaTime * t); + situations.push_back(s); + } + } + return situations; + } + } // namespace diff --git a/samples/blackmisc/samplesperformance.h b/samples/blackmisc/samplesperformance.h index f7e390934..00f69ceed 100644 --- a/samples/blackmisc/samplesperformance.h +++ b/samples/blackmisc/samplesperformance.h @@ -12,6 +12,7 @@ #ifndef BLACKMISCTEST_SAMPLESPERFORMANCEINDEX_H #define BLACKMISCTEST_SAMPLESPERFORMANCEINDEX_H +#include "blackmisc/avaircraftsituationlist.h" #include namespace BlackMiscTest @@ -26,6 +27,15 @@ namespace BlackMiscTest //! Impact of implementation type static int samplesImplementationType(QTextStream &out, int numberOfCallsigns, int numberOfTimes); + //! Interpolator scenario + static int interpolatorScenario(QTextStream &out, int numberOfCallsigns, int numberOfTimes); + + //! Situation values for testing + static BlackMisc::Aviation::CAircraftSituationList createSituations(qint64 baseTimeEpoch, int numberOfCallsigns, int numberOfTimes); + + private: + static const qint64 DeltaTime = 10; + }; } // namespace