diff options
author | jasplin <qt-info@nokia.com> | 2009-12-17 06:43:05 (GMT) |
---|---|---|
committer | jasplin <qt-info@nokia.com> | 2009-12-17 06:43:05 (GMT) |
commit | a66af3b563a90e55015f7cfe7f04f8704ee7d402 (patch) | |
tree | 761229a1a920bac07f1ef4b55d238c79698bbc4a /src/testlib/qbenchmark.cpp | |
parent | 63c8293b60bb997d370a4ec343b7f04808969393 (diff) | |
download | Qt-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.cpp | 51 |
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 - |