aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar@sletta.org>2016-11-08 10:39:02 +0100
committerGunnar Sletta <gunnar@sletta.org>2016-11-08 10:39:02 +0100
commit0b0a974111e059faf450989680ed4f7b40c35555 (patch)
tree7485593e2f729e038036f374f1446b58212c4061
parente668bec65f546553cc1ac58b5f955ed38650c25a (diff)
some work on alternate averaging strategywip/average
-rw-r--r--main.cpp64
1 files changed, 46 insertions, 18 deletions
diff --git a/main.cpp b/main.cpp
index ba7e3f3..4ef5346 100644
--- a/main.cpp
+++ b/main.cpp
@@ -256,15 +256,15 @@ struct Benchmark
{
Benchmark(const QString &file)
: fileName(file)
- , completed(false)
{
}
QString fileName;
QSize windowSize;
- bool completed;
QList<qreal> operationsPerFrame;
+
+ QHash<double, QList<qreal>> averageBuckets;
};
@@ -596,25 +596,50 @@ void BenchmarkRunner::abortAll()
void BenchmarkRunner::recordOperationsPerFrame(qreal ops)
{
Benchmark &bm = benchmarks[m_currentBenchmark];
- bm.completed = true;
bm.operationsPerFrame << ops;
ResultRecorder::recordOperationsPerFrame(bm.fileName, ops);
- int repetitions = options.repeat + options.medianReduce * 2;
- if (bm.operationsPerFrame.size() == repetitions && repetitions > 1) {
-
- QList<qreal> results = bm.operationsPerFrame;
- std::sort(results.begin(), results.end());
- for (int i=0; i<options.medianReduce; ++i) {
- results.pop_front();
- results.pop_back();
+ // int repetitions = options.repeat + options.medianReduce * 2;
+ // if (bm.operationsPerFrame.size() == repetitions && repetitions > 1) {
+
+ // QList<qreal> results = bm.operationsPerFrame;
+ // std::sort(results.begin(), results.end());
+ // for (int i=0; i<options.medianReduce; ++i) {
+ // results.pop_front();
+ // results.pop_back();
+ // }
+
+ // qreal avg = 0;
+ // foreach (qreal r, results)
+ // avg += r;
+
+ // ResultRecorder::recordOperationsPerFrameAverage(bm.fileName, avg / options.repeat, options.repeat);
+ // }
+
+ QList<qreal> bucket;
+ for (QHash<qreal, QList<qreal>>::iterator it = bm.averageBuckets.begin(), end = bm.averageBuckets.end(); it != end; ++it) {
+ qreal avg = it.key();
+ qreal dev = qAbs(ops - avg) / avg;
+ qDebug() << " -- looking at average bucket" << avg << "of size" << it.value().size() << "- deviation:" << dev;
+ if (dev < 0.05) {
+ bucket = it.value();
+ bm.averageBuckets.erase(it);
+ qDebug() << " ---> found matching bucket...";
+ break;
}
+ }
+ bucket.append(ops);
- qreal avg = 0;
- foreach (qreal r, results)
- avg += r;
+ qreal avg = 0;
+ foreach (qreal r, bucket)
+ avg += r;
+ avg /= bucket.size();
+ if (bucket.size() == 1)
+ qDebug() << " ---> forming a new bucket" << avg;
+ bm.averageBuckets.insert(avg, bucket);
+
+ if (bucket.size() >= options.repeat)
+ ResultRecorder::recordOperationsPerFrameAverage(bm.fileName, avg, bucket.size());
- ResultRecorder::recordOperationsPerFrameAverage(bm.fileName, avg / options.repeat, options.repeat);
- }
complete();
}
@@ -623,9 +648,12 @@ void BenchmarkRunner::complete()
m_component->deleteLater();
m_component = 0;
- int repetitions = options.repeat + options.medianReduce * 2;
+ // int repetitions = options.repeat + options.medianReduce * 2;
+ int biggestBucket = 0;
+ foreach (const QList<qreal> &bucket, benchmarks[m_currentBenchmark].averageBuckets)
+ biggestBucket = qMax(biggestBucket, bucket.size());
- if (benchmarks[m_currentBenchmark].operationsPerFrame.size() < repetitions)
+ if (biggestBucket < options.repeat)
QMetaObject::invokeMethod(this, "start", Qt::QueuedConnection);
else
QMetaObject::invokeMethod(this, "maybeStartNext", Qt::QueuedConnection);