diff --git a/modules/ts/src/ts_perf.cpp b/modules/ts/src/ts_perf.cpp index 415fdd510..26076d01f 100644 --- a/modules/ts/src/ts_perf.cpp +++ b/modules/ts/src/ts_perf.cpp @@ -2,6 +2,55 @@ using namespace perf; +int64 TestBase::timeLimitDefault = 0; +unsigned int TestBase::iterationsLimitDefault = (unsigned int)(-1); +int64 TestBase::_timeadjustment = 0; + +const char *command_line_keys = +{ + "{ |perf_max_outliers |8 |percent of allowed outliers}" + "{ |perf_min_samples |10 |minimal required numer of samples}" + "{ |perf_force_samples |100 |force set maximum number of samples for all tests}" + "{ |perf_seed |809564 |seed for random numbers generator}" + "{ |perf_tbb_nthreads |-1 |if TBB is enabled, the number of TBB threads}" + "{ |perf_write_sanity |false |allow to create new records for sanity checks}" + #if ANDROID + "{ |perf_time_limit |6.0 |default time limit for a single test (in seconds)}" + "{ |perf_affinity_mask |0 |set affinity mask for the main thread}" + #else + "{ |perf_time_limit |3.0 |default time limit for a single test (in seconds)}" + #endif + "{ |perf_max_deviation |1.0 |}" + "{h |help |false |}" +}; + +static double param_max_outliers; +static double param_max_deviation; +static unsigned int param_min_samples; +static unsigned int param_force_samples; +static uint64 param_seed; +static double param_time_limit; +static int param_tbb_nthreads; +static bool param_write_sanity; +#if ANDROID +static int param_affinity_mask; + +#include +#include +static void setCurrentThreadAffinityMask(int mask) +{ + pid_t pid=gettid(); + int syscallres=syscall(__NR_sched_setaffinity, pid, sizeof(mask), &mask); + if (syscallres) + { + int err=errno; + err=err;//to avoid warnings about unused variables + LOGE("Error in the syscall setaffinity: mask=%d=0x%x err=%d=0x%x", mask, mask, err, err); + } +} + +#endif + void randu(cv::Mat& m) { const int bigValue = 0x00000FFF; @@ -82,14 +131,22 @@ void Regression::init(const std::string& testSuitName, const std::string& ext) storageOutPath = testSuitName; } - if (storageIn.open(storageInPath, cv::FileStorage::READ)) + try { - rootIn = storageIn.root(); - if (storageInPath.length() > 3 && storageInPath.substr(storageInPath.length()-3) == ".gz") - storageOutPath += "_new"; - storageOutPath += ext; + if (storageIn.open(storageInPath, cv::FileStorage::READ)) + { + rootIn = storageIn.root(); + if (storageInPath.length() > 3 && storageInPath.substr(storageInPath.length()-3) == ".gz") + storageOutPath += "_new"; + storageOutPath += ext; + } } - else + catch(cv::Exception& ex) + { + LOGE("Failed to open sanity data for reading: %s", storageInPath.c_str()); + } + + if(!storageIn.isOpened()) storageOutPath = storageInPath; } @@ -408,17 +465,20 @@ Regression& Regression::operator() (const std::string& name, cv::InputArray arra cv::FileNode n = rootIn[nodename]; if(n.isNone()) { - if (nodename != currentTestNodeName) + if(param_write_sanity) { - if (!currentTestNodeName.empty()) - write() << "}"; - currentTestNodeName = nodename; + if (nodename != currentTestNodeName) + { + if (!currentTestNodeName.empty()) + write() << "}"; + currentTestNodeName = nodename; - write() << nodename << "{"; + write() << nodename << "{"; + } + write() << name << "{"; + write(array); + write() << "}"; } - write() << name << "{"; - write(array); - write() << "}"; } else { @@ -455,53 +515,6 @@ performance_metrics::performance_metrics() /*****************************************************************************************\ * ::perf::TestBase \*****************************************************************************************/ -int64 TestBase::timeLimitDefault = 0; -unsigned int TestBase::iterationsLimitDefault = (unsigned int)(-1); -int64 TestBase::_timeadjustment = 0; - -const char *command_line_keys = -{ - "{ |perf_max_outliers |8 |percent of allowed outliers}" - "{ |perf_min_samples |10 |minimal required numer of samples}" - "{ |perf_force_samples |100 |force set maximum number of samples for all tests}" - "{ |perf_seed |809564 |seed for random numbers generator}" - "{ |perf_tbb_nthreads |-1 |if TBB is enabled, the number of TBB threads}" - #if ANDROID - "{ |perf_time_limit |6.0 |default time limit for a single test (in seconds)}" - "{ |perf_affinity_mask |0 |set affinity mask for the main thread}" - #else - "{ |perf_time_limit |3.0 |default time limit for a single test (in seconds)}" - #endif - "{ |perf_max_deviation |1.0 |}" - "{h |help |false |}" -}; - -double param_max_outliers; -double param_max_deviation; -unsigned int param_min_samples; -unsigned int perf_force_samples; -uint64 param_seed; -double param_time_limit; -int param_tbb_nthreads; -#if ANDROID -int param_affinity_mask; - -#include -#include -static void setCurrentThreadAffinityMask(int mask) -{ - pid_t pid=gettid(); - int syscallres=syscall(__NR_sched_setaffinity, pid, sizeof(mask), &mask); - if (syscallres) - { - int err=errno; - err=err;//to avoid warnings about unused variables - LOGE("Error in the syscall setaffinity: mask=%d=0x%x err=%d=0x%x", mask, mask, err, err); - } -} - -#endif - void TestBase::Init(int argc, const char* const argv[]) { cv::CommandLineParser args(argc, argv, command_line_keys); @@ -510,7 +523,8 @@ void TestBase::Init(int argc, const char* const argv[]) param_max_deviation = std::max(0., args.get("perf_max_deviation")); param_seed = args.get("perf_seed"); param_time_limit = std::max(0., args.get("perf_time_limit")); - perf_force_samples = args.get("perf_force_samples"); + param_force_samples = args.get("perf_force_samples"); + param_write_sanity = args.get("perf_write_sanity"); param_tbb_nthreads = args.get("perf_tbb_nthreads"); #if ANDROID @@ -525,7 +539,7 @@ void TestBase::Init(int argc, const char* const argv[]) } timeLimitDefault = param_time_limit == 0.0 ? 1 : (int64)(param_time_limit * cv::getTickFrequency()); - iterationsLimitDefault = perf_force_samples == 0 ? (unsigned)(-1) : perf_force_samples; + iterationsLimitDefault = param_force_samples == 0 ? (unsigned)(-1) : param_force_samples; _timeadjustment = _calibrate(); }