perf_framework: added TEST_CYCLE_MULTIRUN macros ( invokes function tested several...
authorAnatoly Baksheev <no@email>
Thu, 24 May 2012 17:12:14 +0000 (17:12 +0000)
committerAnatoly Baksheev <no@email>
Thu, 24 May 2012 17:12:14 +0000 (17:12 +0000)
modules/ts/include/opencv2/ts/ts_perf.hpp
modules/ts/src/ts_perf.cpp

index 2df5cc9..067b245 100644 (file)
@@ -279,6 +279,7 @@ private:
 \r
     unsigned int nIters;\r
     unsigned int currentIter;\r
+    unsigned int runsPerIteration;\r
 \r
     performance_metrics metrics;\r
     void validateMetrics();\r
@@ -307,6 +308,7 @@ private:
         _declareHelper& iterations(unsigned int n);\r
         _declareHelper& time(double timeLimitSecs);\r
         _declareHelper& tbb_threads(int n = -1);\r
+        _declareHelper& runs(unsigned int runsNumber);\r
     private:\r
         TestBase* test;\r
         _declareHelper(TestBase* t);\r
@@ -460,6 +462,7 @@ int main(int argc, char **argv)\
 \r
 #define TEST_CYCLE_N(n) for(declare.iterations(n); startTimer(), next(); stopTimer())\r
 #define TEST_CYCLE() for(; startTimer(), next(); stopTimer())\r
+#define TEST_CYCLE_MULTIRUN(runsNum) for(declare.runs(runsNum); startTimer(), next(); stopTimer()) for(int r = 0; r < runsNum; ++r)\r
 \r
 //flags\r
 namespace perf\r
index b9df881..52e99fd 100644 (file)
@@ -731,7 +731,7 @@ performance_metrics& TestBase::calcMetrics()
     int n = 0;\r
     for(TimeVector::const_iterator i = times.begin(); i != times.end(); ++i)\r
     {\r
-        double x = (double)*i;\r
+        double x = static_cast<double>(*i)/runsPerIteration;\r
         if (x < DBL_EPSILON) continue;\r
         double lx = log(x);\r
 \r
@@ -751,14 +751,14 @@ performance_metrics& TestBase::calcMetrics()
     int offset = 0;\r
     if (gstddev > DBL_EPSILON)\r
     {\r
-        double minout = exp(gmean - 3 * gstddev);\r
-        double maxout = exp(gmean + 3 * gstddev);\r
+        double minout = exp(gmean - 3 * gstddev) * runsPerIteration;\r
+        double maxout = exp(gmean + 3 * gstddev) * runsPerIteration;\r
         while(*start < minout) ++start, ++metrics.outliers, ++offset;\r
         do --end, ++metrics.outliers; while(*end > maxout);\r
         ++end, --metrics.outliers;\r
     }\r
 \r
-    metrics.min = (double)*start;\r
+    metrics.min = static_cast<double>(*start)/runsPerIteration;\r
     //calc final metrics\r
     n = 0;\r
     gmean = 0;\r
@@ -768,7 +768,7 @@ performance_metrics& TestBase::calcMetrics()
     int m = 0;\r
     for(; start != end; ++start)\r
     {\r
-        double x = (double)*start;\r
+        double x = static_cast<double>(*start)/runsPerIteration;\r
         if (x > DBL_EPSILON)\r
         {\r
             double lx = log(x);\r
@@ -791,6 +791,8 @@ performance_metrics& TestBase::calcMetrics()
             ? (double)times[offset + n / 2]\r
             : 0.5 * (times[offset + n / 2] + times[offset + n / 2 - 1]);\r
 \r
+    metrics.median /= runsPerIteration;\r
+\r
     return metrics;\r
 }\r
 \r
@@ -902,6 +904,7 @@ void TestBase::SetUp()
 #endif\r
     lastTime = 0;\r
     totalTime = 0;\r
+    runsPerIteration = 1;\r
     nIters = iterationsLimitDefault;\r
     currentIter = (unsigned int)-1;\r
     timeLimit = timeLimitDefault;\r
@@ -1023,6 +1026,12 @@ TestBase::_declareHelper& TestBase::_declareHelper::tbb_threads(int n)
     return *this;\r
 }\r
 \r
+TestBase::_declareHelper& TestBase::_declareHelper::runs(unsigned int runsNumber)\r
+{\r
+    test->runsPerIteration = runsNumber;\r
+    return *this;\r
+}\r
+\r
 TestBase::_declareHelper& TestBase::_declareHelper::in(cv::InputOutputArray a1, int wtype)\r
 {\r
     if (!test->times.empty()) return *this;\r