From de29cb834f46de3b88d7b45fb792cbaca99c1052 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 10 Nov 2006 21:43:16 +0000 Subject: [PATCH] Moved timing measurement of epicsThreadPrivateGet() to epicsThreadPerform.cpp --- src/libCom/test/epicsThreadPerform.cpp | 48 ++++++++++++++++++++++ src/libCom/test/epicsThreadPrivateTest.cpp | 46 +-------------------- 2 files changed, 49 insertions(+), 45 deletions(-) diff --git a/src/libCom/test/epicsThreadPerform.cpp b/src/libCom/test/epicsThreadPerform.cpp index 43fc12f8c..e01fc9430 100644 --- a/src/libCom/test/epicsThreadPerform.cpp +++ b/src/libCom/test/epicsThreadPerform.cpp @@ -170,11 +170,59 @@ static void epicsThreadGetIdSelfPerfTest () } +static epicsThreadPrivate < bool > priv; + +static inline void callItTenTimes () +{ + bool *pFlag; + pFlag = priv.get (); + pFlag = priv.get (); + pFlag = priv.get (); + pFlag = priv.get (); + pFlag = priv.get (); + pFlag = priv.get (); + pFlag = priv.get (); + pFlag = priv.get (); + pFlag = priv.get (); + pFlag = priv.get (); +} + +static inline void callItTenTimesSquared () +{ + callItTenTimes (); + callItTenTimes (); + callItTenTimes (); + callItTenTimes (); + callItTenTimes (); + callItTenTimes (); + callItTenTimes (); + callItTenTimes (); + callItTenTimes (); + callItTenTimes (); +} + +static void timeEpicsThreadPrivateGet () +{ + priv.set ( 0 ); + + epicsTime begin = epicsTime::getCurrent (); + static const unsigned N = 1000u; + for ( unsigned i = 0u; i < N; i++ ) { + callItTenTimesSquared (); + } + double delay = epicsTime::getCurrent() - begin; + delay /= N * 100u; // convert to sec per call + delay *= 1e6; // convert to micro sec + printf("epicsThreadPrivateGet() takes %f microseconds\n", delay); +} + + MAIN(epicsThreadPerform) { epicsThreadPriorityTest (); threadSleepQuantumTest (); threadSleepTest (); epicsThreadGetIdSelfPerfTest (); + timeEpicsThreadPrivateGet (); return 0; } diff --git a/src/libCom/test/epicsThreadPrivateTest.cpp b/src/libCom/test/epicsThreadPrivateTest.cpp index 1bef0c047..913e3f47d 100644 --- a/src/libCom/test/epicsThreadPrivateTest.cpp +++ b/src/libCom/test/epicsThreadPrivateTest.cpp @@ -19,44 +19,12 @@ static epicsThreadPrivate < bool > priv; -static bool doneFlag = false; - extern "C" void epicsThreadPrivateTestThread ( void * ) { testOk1 ( 0 == priv.get () ); static bool var; priv.set ( &var ); testOk1 ( &var == priv.get () ); - doneFlag = true; -} - -inline void callItTenTimes () -{ - bool *pFlag; - pFlag = priv.get (); - pFlag = priv.get (); - pFlag = priv.get (); - pFlag = priv.get (); - pFlag = priv.get (); - pFlag = priv.get (); - pFlag = priv.get (); - pFlag = priv.get (); - pFlag = priv.get (); - pFlag = priv.get (); -} - -inline void callItTenTimesSquared () -{ - callItTenTimes (); - callItTenTimes (); - callItTenTimes (); - callItTenTimes (); - callItTenTimes (); - callItTenTimes (); - callItTenTimes (); - callItTenTimes (); - callItTenTimes (); - callItTenTimes (); } MAIN(epicsThreadPrivateTest) @@ -70,24 +38,12 @@ MAIN(epicsThreadPrivateTest) epicsThreadCreate ( "epicsThreadPrivateTest", epicsThreadPriorityMax, epicsThreadGetStackSize ( epicsThreadStackSmall ), epicsThreadPrivateTestThread, 0 ); - while ( ! doneFlag ) { - epicsThreadSleep ( 0.1 ); - } + epicsThreadSleep ( 1.0 ); testOk1 ( &var == priv.get() ); priv.set ( 0 ); testOk1 ( 0 == priv.get() ); - epicsTime begin = epicsTime::getCurrent (); - static const unsigned N = 1000u; - for ( unsigned i = 0u; i < N; i++ ) { - callItTenTimesSquared (); - } - double delay = epicsTime::getCurrent() - begin; - delay /= N * 100u; // convert to sec per call - delay *= 1e6; // convert to micro sec - testDiag("epicsThreadPrivateGet() takes %f microseconds", delay); - return testDone(); }