From 6455488ff434605d00efd7c80df02b34fd8752d0 Mon Sep 17 00:00:00 2001 From: Anatoly Baksheev Date: Thu, 24 May 2012 17:12:14 +0000 Subject: [PATCH] perf_framework: added TEST_CYCLE_MULTIRUN macros ( invokes function tested several times at each iteration ) --- modules/ts/include/opencv2/ts/ts_perf.hpp | 3 +++ modules/ts/src/ts_perf.cpp | 19 ++++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/modules/ts/include/opencv2/ts/ts_perf.hpp b/modules/ts/include/opencv2/ts/ts_perf.hpp index 2df5cc9..067b245 100644 --- a/modules/ts/include/opencv2/ts/ts_perf.hpp +++ b/modules/ts/include/opencv2/ts/ts_perf.hpp @@ -279,6 +279,7 @@ private: unsigned int nIters; unsigned int currentIter; + unsigned int runsPerIteration; performance_metrics metrics; void validateMetrics(); @@ -307,6 +308,7 @@ private: _declareHelper& iterations(unsigned int n); _declareHelper& time(double timeLimitSecs); _declareHelper& tbb_threads(int n = -1); + _declareHelper& runs(unsigned int runsNumber); private: TestBase* test; _declareHelper(TestBase* t); @@ -460,6 +462,7 @@ int main(int argc, char **argv)\ #define TEST_CYCLE_N(n) for(declare.iterations(n); startTimer(), next(); stopTimer()) #define TEST_CYCLE() for(; startTimer(), next(); stopTimer()) +#define TEST_CYCLE_MULTIRUN(runsNum) for(declare.runs(runsNum); startTimer(), next(); stopTimer()) for(int r = 0; r < runsNum; ++r) //flags namespace perf diff --git a/modules/ts/src/ts_perf.cpp b/modules/ts/src/ts_perf.cpp index b9df881..52e99fd 100644 --- a/modules/ts/src/ts_perf.cpp +++ b/modules/ts/src/ts_perf.cpp @@ -731,7 +731,7 @@ performance_metrics& TestBase::calcMetrics() int n = 0; for(TimeVector::const_iterator i = times.begin(); i != times.end(); ++i) { - double x = (double)*i; + double x = static_cast(*i)/runsPerIteration; if (x < DBL_EPSILON) continue; double lx = log(x); @@ -751,14 +751,14 @@ performance_metrics& TestBase::calcMetrics() int offset = 0; if (gstddev > DBL_EPSILON) { - double minout = exp(gmean - 3 * gstddev); - double maxout = exp(gmean + 3 * gstddev); + double minout = exp(gmean - 3 * gstddev) * runsPerIteration; + double maxout = exp(gmean + 3 * gstddev) * runsPerIteration; while(*start < minout) ++start, ++metrics.outliers, ++offset; do --end, ++metrics.outliers; while(*end > maxout); ++end, --metrics.outliers; } - metrics.min = (double)*start; + metrics.min = static_cast(*start)/runsPerIteration; //calc final metrics n = 0; gmean = 0; @@ -768,7 +768,7 @@ performance_metrics& TestBase::calcMetrics() int m = 0; for(; start != end; ++start) { - double x = (double)*start; + double x = static_cast(*start)/runsPerIteration; if (x > DBL_EPSILON) { double lx = log(x); @@ -791,6 +791,8 @@ performance_metrics& TestBase::calcMetrics() ? (double)times[offset + n / 2] : 0.5 * (times[offset + n / 2] + times[offset + n / 2 - 1]); + metrics.median /= runsPerIteration; + return metrics; } @@ -902,6 +904,7 @@ void TestBase::SetUp() #endif lastTime = 0; totalTime = 0; + runsPerIteration = 1; nIters = iterationsLimitDefault; currentIter = (unsigned int)-1; timeLimit = timeLimitDefault; @@ -1023,6 +1026,12 @@ TestBase::_declareHelper& TestBase::_declareHelper::tbb_threads(int n) return *this; } +TestBase::_declareHelper& TestBase::_declareHelper::runs(unsigned int runsNumber) +{ + test->runsPerIteration = runsNumber; + return *this; +} + TestBase::_declareHelper& TestBase::_declareHelper::in(cv::InputOutputArray a1, int wtype) { if (!test->times.empty()) return *this; -- 2.7.4