\r
unsigned int nIters;\r
unsigned int currentIter;\r
+ unsigned int runsPerIteration;\r
\r
performance_metrics metrics;\r
void validateMetrics();\r
_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
\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
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
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
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
? (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
#endif\r
lastTime = 0;\r
totalTime = 0;\r
+ runsPerIteration = 1;\r
nIters = iterationsLimitDefault;\r
currentIter = (unsigned int)-1;\r
timeLimit = timeLimitDefault;\r
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