summaryrefslogtreecommitdiffstats
path: root/src/testlib/qbenchmark.cpp
diff options
context:
space:
mode:
authorjasplin <qt-info@nokia.com>2009-12-17 06:43:05 (GMT)
committerjasplin <qt-info@nokia.com>2009-12-17 06:43:05 (GMT)
commita66af3b563a90e55015f7cfe7f04f8704ee7d402 (patch)
tree761229a1a920bac07f1ef4b55d238c79698bbc4a /src/testlib/qbenchmark.cpp
parent63c8293b60bb997d370a4ec343b7f04808969393 (diff)
downloadQt-a66af3b563a90e55015f7cfe7f04f8704ee7d402.zip
Qt-a66af3b563a90e55015f7cfe7f04f8704ee7d402.tar.gz
Qt-a66af3b563a90e55015f7cfe7f04f8704ee7d402.tar.bz2
Added QTest::setBenchmarkResult() to public API.
A benchmark result can now be registered explicitly using the QTest::setBenchmarkResult() function as an alternative to using a QBENCHMARK* macro. This gives benchmark writers the freedom to compute the benchmark result however they like and not be dependent on the automatic iteration/accumulation algorithm of a QBENCHMARK* macro. The function takes two arguments: a value and a metric. The value must be a non-negative real, while the metric is an enum type. WARNING: The set of available metrics include metrics for which a high value is considered better (i.e. faster) than a low value (one example is 'frames per second'). QTestLib currently does not distinguish between the two cases of "higher is better" and "lower is better", and leaves it to external tools (parsing the QTestLib output) to recognize them and do any necessary conversion. A tool that plots benchmark result history could e.g. convert all "higher is better" to "lower is better". For the 'frames per second' case, this would typically mean converting FPS to SPF (= 1/FPS). Reviewed-by: MortenS
Diffstat (limited to 'src/testlib/qbenchmark.cpp')
-rw-r--r--src/testlib/qbenchmark.cpp51
1 files changed, 27 insertions, 24 deletions
diff --git a/src/testlib/qbenchmark.cpp b/src/testlib/qbenchmark.cpp
index 3bd9054..b2f388e 100644
--- a/src/testlib/qbenchmark.cpp
+++ b/src/testlib/qbenchmark.cpp
@@ -41,6 +41,7 @@
#include "QtTest/qbenchmark.h"
#include "QtTest/private/qbenchmark_p.h"
+#include "QtTest/private/qbenchmarkmetric_p.h"
#ifdef QT_GUI_LIB
#include <QtGui/qapplication.h>
@@ -138,7 +139,7 @@ void QBenchmarkTestMethodData::endDataRun()
int QBenchmarkTestMethodData::adjustIterationCount(int suggestion)
{
- // Let the -iteration-count option override the measurer.
+ // Let the -iterations option override the measurer.
if (QBenchmarkGlobalData::current->iterationCount != -1) {
iterationCount = QBenchmarkGlobalData::current->iterationCount;
} else {
@@ -148,12 +149,13 @@ int QBenchmarkTestMethodData::adjustIterationCount(int suggestion)
return iterationCount;
}
-void QBenchmarkTestMethodData::setResult(qint64 value)
+void QBenchmarkTestMethodData::setResult(
+ qreal value, QTest::QBenchmarkMetric metric, bool setByMacro)
{
bool accepted = false;
// Always accept the result if the iteration count has been
- // specified on the command line with -iteartion-count.
+ // specified on the command line with -iterations.
if (QBenchmarkGlobalData::current->iterationCount != -1)
accepted = true;
@@ -161,7 +163,7 @@ void QBenchmarkTestMethodData::setResult(qint64 value)
iterationCount = 1;
accepted = true;
}
-
+
// Test the result directly without calling the measurer if the minimum time
// has been specifed on the command line with -minimumvalue.
else if (QBenchmarkGlobalData::current->walltimeMinimum != -1)
@@ -175,8 +177,8 @@ void QBenchmarkTestMethodData::setResult(qint64 value)
else
iterationCount *= 2;
- this->result =
- QBenchmarkResult(QBenchmarkGlobalData::current->context, value, iterationCount);
+ this->result = QBenchmarkResult(
+ QBenchmarkGlobalData::current->context, value, iterationCount, metric, setByMacro);
}
/*!
@@ -208,7 +210,8 @@ QTest::QBenchmarkIterationController::QBenchmarkIterationController()
*/
QTest::QBenchmarkIterationController::~QBenchmarkIterationController()
{
- QBenchmarkTestMethodData::current->setResult(QTest::endBenchmarkMeasurement());
+ const qreal result = QTest::endBenchmarkMeasurement();
+ QBenchmarkTestMethodData::current->setResult(result, QBenchmarkGlobalData::current->measurer->metricType());
}
/*! \internal
@@ -259,28 +262,30 @@ void QTest::beginBenchmarkMeasurement()
/*! \internal
*/
-qint64 QTest::endBenchmarkMeasurement()
+quint64 QTest::endBenchmarkMeasurement()
{
// the clock is ticking before the line below, don't add code here.
return QBenchmarkGlobalData::current->measurer->stop();
}
-/*! \internal
-*/
-void QTest::setResult(qint64 result)
-{
- QBenchmarkTestMethodData::current->setResult(result);
-}
-
-/*! \internal
+/*!
+ Sets the benchmark result for this test function to \a result.
+
+ Use this function if you want to report benchmark results without
+ using the QBENCHMARK macro. Use \a metric to specify how QTestLib
+ should interpret the results.
+
+ The context for the result will be the test function name and any
+ data tag from the _data function. This function can only be called
+ once in each test function, subsequent calls will replace the
+ earlier reported results.
+
+ Note that the -iterations command line argument has no effect
+ on test functions without the QBENCHMARK macro.
*/
-void QTest::setResult(const QString &tag, qint64 result)
+void QTest::setBenchmarkResult(qreal result, QTest::QBenchmarkMetric metric)
{
- QBenchmarkContext context = QBenchmarkGlobalData::current->context;
- context.tag = tag;
- QBenchmarkTestMethodData::current->result =
- QBenchmarkResult( context, result,
- QBenchmarkTestMethodData::current->iterationCount);
+ QBenchmarkTestMethodData::current->setResult(result, metric, false);
}
template <typename T>
@@ -298,6 +303,4 @@ Q_TYPENAME T::value_type qAverage(const T &container)
return acc / count;
}
-
QT_END_NAMESPACE
-