From 7315f028886a1a509e67fcde3aea64498e714a36 Mon Sep 17 00:00:00 2001 From: Jeff Hill Date: Thu, 23 Jul 2009 17:25:51 +0000 Subject: [PATCH] added cvtFastPerfotm test --- src/libCom/test/Makefile | 3 + src/libCom/test/cvtFastPerform.cpp | 133 +++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 src/libCom/test/cvtFastPerform.cpp diff --git a/src/libCom/test/Makefile b/src/libCom/test/Makefile index 638be1667..d348b8ae8 100644 --- a/src/libCom/test/Makefile +++ b/src/libCom/test/Makefile @@ -165,6 +165,9 @@ fdmgrTest_SRCS += fdmgrTest.c fdmgrTest_LIBS += ca # FIXME: program never exits. +TESTPROD_HOST += cvtFastPerform +cvtFastPerform_SRCS += cvtFastPerform.cpp +testHarness_SRCS += cvtFastPerform.cpp include $(TOP)/configure/RULES diff --git a/src/libCom/test/cvtFastPerform.cpp b/src/libCom/test/cvtFastPerform.cpp new file mode 100644 index 000000000..07d24488d --- /dev/null +++ b/src/libCom/test/cvtFastPerform.cpp @@ -0,0 +1,133 @@ + +// Author: Jeff Hill, LANL + +#include +#include +#include +#include + +#include "epicsStdio.h" +#include "cvtFast.h" +#include "epicsTime.h" + + +typedef void ( * PTestFunc ) ( const double &, char * pBug, size_t bufSize ); + +class Test { +public: + Test (); + void execute (); +protected: + char _pDst[128]; + double _srcVal; + unsigned short _prec; + static unsigned const _nUnrolled = 10; + static const unsigned _uSecPerSec = 1000000; + static unsigned const _nIterations = 10000; + virtual void _target () = 0; + void _measure (); + Test ( const Test & ); + Test & operator = ( Test & ); +}; + +class TestCvtFastDouble : public Test { +protected: + void _target (); +}; + +class TestSNPrintf : public Test { +protected: + void _target (); +}; + +Test :: + Test () : + _srcVal ( 0.0 ), _prec ( 0 ) +{ +} + +void Test :: execute () +{ + static const unsigned lowPrecision = 2; + static const unsigned highPrecision = DBL_MANT_DIG; + + for ( unsigned i = 0; i < 10; i++ ) { + double mVal = rand (); + mVal /= (RAND_MAX + 1); + double fEVal = rand (); + fEVal /= (RAND_MAX + 1); + fEVal *= DBL_MAX_EXP - DBL_MIN_EXP; + fEVal += DBL_MIN_EXP; + int eVal = static_cast < int > ( fEVal + 0.5 ); + _srcVal = ldexp ( mVal, eVal ); + for ( _prec = lowPrecision; + _prec <= highPrecision; _prec += 4u ) { + _measure (); + } + } +} + +void Test :: _measure () +{ + epicsTime beg = epicsTime :: getCurrent (); + for ( unsigned i = 0; i < _nIterations; i++ ) { + _target (); + } + epicsTime end = epicsTime :: getCurrent (); + double elapsed = end - beg; + elapsed /= _nIterations * _nUnrolled; + elapsed *= _uSecPerSec; + printf ( " %4.4f usec, prec=%i, val=%4.4g, for %s\n", + elapsed, _prec, _srcVal, typeid ( *this ).name () ); +} + +void TestCvtFastDouble :: _target () +{ + cvtDoubleToString ( _srcVal, _pDst, _prec ); + cvtDoubleToString ( _srcVal, _pDst, _prec ); + cvtDoubleToString ( _srcVal, _pDst, _prec ); + cvtDoubleToString ( _srcVal, _pDst, _prec ); + cvtDoubleToString ( _srcVal, _pDst, _prec ); + + cvtDoubleToString ( _srcVal, _pDst, _prec ); + cvtDoubleToString ( _srcVal, _pDst, _prec ); + cvtDoubleToString ( _srcVal, _pDst, _prec ); + cvtDoubleToString ( _srcVal, _pDst, _prec ); + cvtDoubleToString ( _srcVal, _pDst, _prec ); +} + +void TestSNPrintf :: _target () +{ + epicsSnprintf ( _pDst, sizeof ( _pDst ), "%.*g", + static_cast < int > ( _prec ), _srcVal ); + epicsSnprintf ( _pDst, sizeof ( _pDst ), "%.*g", + static_cast < int > ( _prec ), _srcVal ); + epicsSnprintf ( _pDst, sizeof ( _pDst ), "%.*g", + static_cast < int > ( _prec ), _srcVal ); + epicsSnprintf ( _pDst, sizeof ( _pDst ), "%.*g", + static_cast < int > ( _prec ), _srcVal ); + epicsSnprintf ( _pDst, sizeof ( _pDst ), "%.*g", + static_cast < int > ( _prec ), _srcVal ); + + epicsSnprintf ( _pDst, sizeof ( _pDst ), "%.*g", + static_cast < int > ( _prec ), _srcVal ); + epicsSnprintf ( _pDst, sizeof ( _pDst ), "%.*g", + static_cast < int > ( _prec ), _srcVal ); + epicsSnprintf ( _pDst, sizeof ( _pDst ), "%.*g", + static_cast < int > ( _prec ), _srcVal ); + epicsSnprintf ( _pDst, sizeof ( _pDst ), "%.*g", + static_cast < int > ( _prec ), _srcVal ); + epicsSnprintf ( _pDst, sizeof ( _pDst ), "%.*g", + static_cast < int > ( _prec ), _srcVal ); +} + +int main () +{ + TestCvtFastDouble testCvtFastDouble; + TestSNPrintf testSNPrintf; + + testCvtFastDouble.execute (); + testSNPrintf.execute (); + + return 0; +}