From b8af7c5f86068b1b8d945e84759283e8ab471dff Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 21 Sep 2017 18:50:54 +0300 Subject: [PATCH] ts: update perf test - use GTest tuple definitions instead of std::tr1 - use "const static" for cv::Size contants to reduce generated binary code - PERF_TEST_P() violates TEST_P() original semantic. Added PERF_TEST_P_() macro --- modules/ts/include/opencv2/ts.hpp | 11 +++- modules/ts/include/opencv2/ts/cuda_perf.hpp | 4 +- modules/ts/include/opencv2/ts/ocl_perf.hpp | 3 -- modules/ts/include/opencv2/ts/ocl_test.hpp | 2 +- modules/ts/include/opencv2/ts/ts_ext.hpp | 27 +++++----- modules/ts/include/opencv2/ts/ts_perf.hpp | 84 ++++++++++++++++++----------- 6 files changed, 81 insertions(+), 50 deletions(-) diff --git a/modules/ts/include/opencv2/ts.hpp b/modules/ts/include/opencv2/ts.hpp index 46a555e..d630a5a 100644 --- a/modules/ts/include/opencv2/ts.hpp +++ b/modules/ts/include/opencv2/ts.hpp @@ -58,8 +58,8 @@ # define GTEST_USES_POSIX_RE 0 #endif -#define PARAM_TEST_CASE(name, ...) struct name : testing::TestWithParam< std::tr1::tuple< __VA_ARGS__ > > -#define GET_PARAM(k) std::tr1::get< k >(GetParam()) +#define PARAM_TEST_CASE(name, ...) struct name : testing::TestWithParam< testing::tuple< __VA_ARGS__ > > +#define GET_PARAM(k) testing::get< k >(GetParam()) namespace cvtest { @@ -70,6 +70,13 @@ using namespace cv; using testing::Values; using testing::Combine; +// Tuple stuff from Google Tests +using testing::get; +using testing::make_tuple; +using testing::tuple; +using testing::tuple_size; +using testing::tuple_element; + class SkipTestException: public cv::Exception { diff --git a/modules/ts/include/opencv2/ts/cuda_perf.hpp b/modules/ts/include/opencv2/ts/cuda_perf.hpp index 3c162ad..c0c2b7d 100644 --- a/modules/ts/include/opencv2/ts/cuda_perf.hpp +++ b/modules/ts/include/opencv2/ts/cuda_perf.hpp @@ -62,9 +62,9 @@ namespace perf #define CUDA_CHANNELS_1_3_4 testing::Values(MatCn(Gray), MatCn(BGR), MatCn(BGRA)) #define CUDA_CHANNELS_1_3 testing::Values(MatCn(Gray), MatCn(BGR)) - #define GET_PARAM(k) std::tr1::get< k >(GetParam()) + #define GET_PARAM(k) testing::get< k >(GetParam()) - #define DEF_PARAM_TEST(name, ...) typedef ::perf::TestBaseWithParam< std::tr1::tuple< __VA_ARGS__ > > name + #define DEF_PARAM_TEST(name, ...) typedef ::perf::TestBaseWithParam< testing::tuple< __VA_ARGS__ > > name #define DEF_PARAM_TEST_1(name, param_type) typedef ::perf::TestBaseWithParam< param_type > name DEF_PARAM_TEST_1(Sz, cv::Size); diff --git a/modules/ts/include/opencv2/ts/ocl_perf.hpp b/modules/ts/include/opencv2/ts/ocl_perf.hpp index 4d57aaa..ce25b71 100644 --- a/modules/ts/include/opencv2/ts/ocl_perf.hpp +++ b/modules/ts/include/opencv2/ts/ocl_perf.hpp @@ -52,9 +52,6 @@ namespace ocl { using namespace perf; -using std::tr1::get; -using std::tr1::tuple; - #define OCL_PERF_STRATEGY PERF_STRATEGY_SIMPLE #define OCL_PERF_TEST(fixture, name) SIMPLE_PERF_TEST(fixture, name) diff --git a/modules/ts/include/opencv2/ts/ocl_test.hpp b/modules/ts/include/opencv2/ts/ocl_test.hpp index 54b33ec..294fab4 100644 --- a/modules/ts/include/opencv2/ts/ocl_test.hpp +++ b/modules/ts/include/opencv2/ts/ocl_test.hpp @@ -325,7 +325,7 @@ struct CV_EXPORTS TSTestWithParam : public TestUtils, public ::testing::TestWith }; #undef PARAM_TEST_CASE -#define PARAM_TEST_CASE(name, ...) struct name : public ::cvtest::ocl::TSTestWithParam< std::tr1::tuple< __VA_ARGS__ > > +#define PARAM_TEST_CASE(name, ...) struct name : public ::cvtest::ocl::TSTestWithParam< testing::tuple< __VA_ARGS__ > > #ifndef IMPLEMENT_PARAM_CLASS #define IMPLEMENT_PARAM_CLASS(name, type) \ diff --git a/modules/ts/include/opencv2/ts/ts_ext.hpp b/modules/ts/include/opencv2/ts/ts_ext.hpp index 0bdd346..259f869 100644 --- a/modules/ts/include/opencv2/ts/ts_ext.hpp +++ b/modules/ts/include/opencv2/ts/ts_ext.hpp @@ -12,17 +12,17 @@ namespace cvtest { void checkIppStatus(); } -#define CV_TEST_INIT \ +#define CV__TEST_INIT \ cv::ipp::setIppStatus(0); \ cv::theRNG().state = cvtest::param_seed; -#define CV_TEST_CLEANUP ::cvtest::checkIppStatus(); -#define CV_TEST_BODY_IMPL(name) \ +#define CV__TEST_CLEANUP ::cvtest::checkIppStatus(); +#define CV__TEST_BODY_IMPL(name) \ { \ CV__TRACE_APP_FUNCTION_NAME(name); \ try { \ - CV_TEST_INIT \ + CV__TEST_INIT \ Body(); \ - CV_TEST_CLEANUP \ + CV__TEST_CLEANUP \ } \ catch (cvtest::SkipTestException& e) \ { \ @@ -54,7 +54,7 @@ void checkIppStatus(); ::testing::Test::TearDownTestCase, \ new ::testing::internal::TestFactoryImpl<\ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\ - void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() CV_TEST_BODY_IMPL( #test_case_name "_" #test_name ) \ + void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() CV__TEST_BODY_IMPL( #test_case_name "_" #test_name ) \ void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::Body() #undef TEST_F @@ -80,17 +80,17 @@ void checkIppStatus(); test_fixture::TearDownTestCase, \ new ::testing::internal::TestFactoryImpl<\ GTEST_TEST_CLASS_NAME_(test_fixture, test_name)>);\ - void GTEST_TEST_CLASS_NAME_(test_fixture, test_name)::TestBody() CV_TEST_BODY_IMPL( #test_fixture "_" #test_name ) \ + void GTEST_TEST_CLASS_NAME_(test_fixture, test_name)::TestBody() CV__TEST_BODY_IMPL( #test_fixture "_" #test_name ) \ void GTEST_TEST_CLASS_NAME_(test_fixture, test_name)::Body() -#undef TEST_P -#define TEST_P(test_case_name, test_name) \ +// Don't use directly +#define CV__TEST_P(test_case_name, test_name, bodyMethodName, BODY_IMPL/*(name_str)*/) \ class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \ : public test_case_name { \ public: \ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \ private: \ - virtual void Body(); \ + virtual void bodyMethodName(); \ virtual void TestBody(); \ static int AddToRegistry() { \ ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ @@ -112,7 +112,10 @@ void checkIppStatus(); int GTEST_TEST_CLASS_NAME_(test_case_name, \ test_name)::gtest_registering_dummy_ = \ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \ - void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() CV_TEST_BODY_IMPL( #test_case_name "_" #test_name ) \ - void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::Body() + void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() BODY_IMPL( #test_case_name "_" #test_name ) \ + void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::bodyMethodName() + +#undef TEST_P +#define TEST_P(test_case_name, test_name) CV__TEST_P(test_case_name, test_name, Body, CV__TEST_BODY_IMPL) #endif // OPENCV_TS_EXT_HPP diff --git a/modules/ts/include/opencv2/ts/ts_perf.hpp b/modules/ts/include/opencv2/ts/ts_perf.hpp index 37e1586..3781365 100644 --- a/modules/ts/include/opencv2/ts/ts_perf.hpp +++ b/modules/ts/include/opencv2/ts/ts_perf.hpp @@ -27,40 +27,49 @@ // declare major namespaces to avoid errors on unknown namespace namespace cv { namespace cuda {} namespace ocl {} } +namespace cvtest { } namespace perf { + +// Tuple stuff from Google Tests +using testing::get; +using testing::make_tuple; +using testing::tuple; +using testing::tuple_size; +using testing::tuple_element; + class TestBase; /*****************************************************************************************\ * Predefined typical frame sizes and typical test parameters * \*****************************************************************************************/ -const cv::Size szQVGA = cv::Size(320, 240); -const cv::Size szVGA = cv::Size(640, 480); -const cv::Size szSVGA = cv::Size(800, 600); -const cv::Size szXGA = cv::Size(1024, 768); -const cv::Size szSXGA = cv::Size(1280, 1024); -const cv::Size szWQHD = cv::Size(2560, 1440); - -const cv::Size sznHD = cv::Size(640, 360); -const cv::Size szqHD = cv::Size(960, 540); -const cv::Size sz240p = szQVGA; -const cv::Size sz720p = cv::Size(1280, 720); -const cv::Size sz1080p = cv::Size(1920, 1080); -const cv::Size sz1440p = szWQHD; -const cv::Size sz2160p = cv::Size(3840, 2160);//UHDTV1 4K -const cv::Size sz4320p = cv::Size(7680, 4320);//UHDTV2 8K - -const cv::Size sz3MP = cv::Size(2048, 1536); -const cv::Size sz5MP = cv::Size(2592, 1944); -const cv::Size sz2K = cv::Size(2048, 2048); - -const cv::Size szODD = cv::Size(127, 61); - -const cv::Size szSmall24 = cv::Size(24, 24); -const cv::Size szSmall32 = cv::Size(32, 32); -const cv::Size szSmall64 = cv::Size(64, 64); -const cv::Size szSmall128 = cv::Size(128, 128); +const static cv::Size szQVGA = cv::Size(320, 240); +const static cv::Size szVGA = cv::Size(640, 480); +const static cv::Size szSVGA = cv::Size(800, 600); +const static cv::Size szXGA = cv::Size(1024, 768); +const static cv::Size szSXGA = cv::Size(1280, 1024); +const static cv::Size szWQHD = cv::Size(2560, 1440); + +const static cv::Size sznHD = cv::Size(640, 360); +const static cv::Size szqHD = cv::Size(960, 540); +const static cv::Size sz240p = szQVGA; +const static cv::Size sz720p = cv::Size(1280, 720); +const static cv::Size sz1080p = cv::Size(1920, 1080); +const static cv::Size sz1440p = szWQHD; +const static cv::Size sz2160p = cv::Size(3840, 2160);//UHDTV1 4K +const static cv::Size sz4320p = cv::Size(7680, 4320);//UHDTV2 8K + +const static cv::Size sz3MP = cv::Size(2048, 1536); +const static cv::Size sz5MP = cv::Size(2592, 1944); +const static cv::Size sz2K = cv::Size(2048, 2048); + +const static cv::Size szODD = cv::Size(127, 61); + +const static cv::Size szSmall24 = cv::Size(24, 24); +const static cv::Size szSmall32 = cv::Size(32, 32); +const static cv::Size szSmall64 = cv::Size(64, 64); +const static cv::Size szSmall128 = cv::Size(128, 128); #define SZ_ALL_VGA ::testing::Values(::perf::szQVGA, ::perf::szVGA, ::perf::szSVGA) #define SZ_ALL_GA ::testing::Values(::perf::szQVGA, ::perf::szVGA, ::perf::szSVGA, ::perf::szXGA, ::perf::szSXGA) @@ -492,7 +501,7 @@ public: template class TestBaseWithParam: public TestBase, public ::testing::WithParamInterface {}; -typedef std::tr1::tuple Size_MatType_t; +typedef tuple Size_MatType_t; typedef TestBaseWithParam Size_MatType; /*****************************************************************************************\ @@ -514,6 +523,13 @@ CV_EXPORTS void PrintTo(const Size& sz, ::std::ostream* os); /*****************************************************************************************\ * Macro definitions for performance tests * \*****************************************************************************************/ + +#define CV__PERF_TEST_BODY_IMPL(name) \ + { \ + CV__TRACE_APP_FUNCTION_NAME("PERF_TEST: " name); \ + RunPerfTestBody(); \ + } + #define PERF_PROXY_NAMESPACE_NAME_(test_case_name, test_name) \ test_case_name##_##test_name##_perf_namespace_proxy @@ -538,7 +554,7 @@ CV_EXPORTS void PrintTo(const Size& sz, ::std::ostream* os); protected:\ virtual void PerfTestBody();\ };\ - TEST_F(test_case_name, test_name){ CV_TRACE_REGION("PERF_TEST: " #test_case_name "_" #test_name); RunPerfTestBody(); }\ + TEST_F(test_case_name, test_name){ CV__PERF_TEST_BODY_IMPL(#test_case_name "_" #test_name); }\ }\ void PERF_PROXY_NAMESPACE_NAME_(test_case_name, test_name)::test_case_name::PerfTestBody() @@ -576,12 +592,20 @@ CV_EXPORTS void PrintTo(const Size& sz, ::std::ostream* os); protected:\ virtual void PerfTestBody();\ };\ - TEST_F(fixture, testname){ CV_TRACE_REGION("PERF_TEST: " #fixture "_" #testname); RunPerfTestBody(); }\ + TEST_F(fixture, testname){ CV__PERF_TEST_BODY_IMPL(#fixture "_" #testname); }\ }\ void PERF_PROXY_NAMESPACE_NAME_(fixture, testname)::fixture::PerfTestBody() // Defines a parametrized performance test. // +// @Note PERF_TEST_P() below violates behavior of original Google Tests - there is no tests instantiation in original TEST_P() +// This macro is intended for usage with separate INSTANTIATE_TEST_CASE_P macro +#define PERF_TEST_P_(test_case_name, test_name) CV__TEST_P(test_case_name, test_name, PerfTestBody, CV__PERF_TEST_BODY_IMPL) + +// Defines a parametrized performance test. +// +// @Note Original TEST_P() macro doesn't instantiate tests with parameters. To keep original usage use PERF_TEST_P_() macro +// // The first parameter is the name of the test fixture class, which // also doubles as the test case name. The second parameter is the // name of the test within the test case. @@ -609,7 +633,7 @@ CV_EXPORTS void PrintTo(const Size& sz, ::std::ostream* os); protected:\ virtual void PerfTestBody();\ };\ - TEST_P(fixture##_##name, name /*perf*/){ CV_TRACE_REGION("PERF_TEST: " #fixture "_" #name); RunPerfTestBody(); }\ + CV__TEST_P(fixture##_##name, name, PerfTestBodyDummy, CV__PERF_TEST_BODY_IMPL){} \ INSTANTIATE_TEST_CASE_P(/*none*/, fixture##_##name, params);\ void fixture##_##name::PerfTestBody() -- 2.7.4