1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************** 3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Copyright (c) 2002-2007, International Business Machines 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************** 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/ 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef _UPERF_H 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define _UPERF_H 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h" 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/unistr.h" 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustring.h" 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/testtype.h" 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utimer.h" 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ucbuf.h" 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Forward declarations from uoptions.h. 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct UOption; 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef struct UOption UOption; 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_CONVERSION 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_USE 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Use the TESTCASE macro in subclasses of IntlTest. Define the 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// runIndexedTest method in this fashion: 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//| void MyTest::runIndexedTest(int32_t index, UBool exec, 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//| const char* &name, char* /*par*/) { 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//| switch (index) { 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//| TESTCASE(0,TestSomething); 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//| TESTCASE(1,TestSomethingElse); 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//| TESTCASE(2,TestAnotherThing); 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//| default: 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//| name = ""; 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//| return NULL; 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//| } 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//| } 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define TESTCASE(id,test) \ 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case id: \ 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru name = #test; \ 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (exec) { \ 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stdout,#test "---"); \ 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stdout,"\n"); \ 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return test(); \ 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } \ 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define TESTCASE(id,test) \ 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case id: \ 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru name = #test; \ 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (exec) { \ 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return test(); \ 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } \ 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Subclasses of PerfTest will need to create subclasses of 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Function that define a call() method which contains the code to 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * be timed. They then call setTestFunction() in their "Test..." 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * method to establish this as the current test functor. 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass T_CTEST_EXPORT_API UPerfFunction { 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic: 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Subclasses must implement this method to do the action to be 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * measured. 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru virtual void call(UErrorCode* status)=0; 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Subclasses must implement this method to return positive 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * integer indicating the number of operations in a single 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * call to this object's call() method. 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru virtual long getOperationsPerIteration()=0; 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Subclasses should override this method to return either positive 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * or negative integer indicating the number of events in a single 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * call to this object's call() method, if applicable 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * e.g: Number of breaks / iterations for break iterator 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru virtual long getEventsPerIteration(){ 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return -1; 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * destructor 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru virtual ~UPerfFunction() {} 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Call call() n times in a tight loop and return the elapsed 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * milliseconds. If n is small and call() is fast the return 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * result may be zero. Small return values have limited 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * meaningfulness, depending on the underlying CPU and OS. 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru virtual double time(int32_t n, UErrorCode* status) { 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UTimer start, stop; 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru utimer_getTime(&start); 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while (n-- > 0) { 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru call(status); 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru utimer_getTime(&stop); 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return utimer_getDeltaSeconds(&start,&stop); // ms 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass T_CTEST_EXPORT_API UPerfTest { 113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic: 114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool run(); 115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool runTest( char* name = NULL, char* par = NULL ); // not to be overidden 116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru virtual void usage( void ) ; 118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru virtual ~UPerfTest(); 120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void setCaller( UPerfTest* callingTest ); // for internal use only 122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void setPath( char* path ); // for internal use only 124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ULine* getLines(UErrorCode& status); 126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const UChar* getBuffer(int32_t& len,UErrorCode& status); 128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruprotected: 130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UPerfTest(int32_t argc, const char* argv[], UErrorCode& status); 131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UPerfTest(int32_t argc, const char* argv[], 133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UOption addOptions[], int32_t addOptionsCount, 134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char *addUsage, 135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode& status); 136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void init(UOption addOptions[], int32_t addOptionsCount, 138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode& status); 139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru virtual UPerfFunction* runIndexedTest( int32_t index, UBool exec, const char* &name, char* par = NULL ); // overide ! 141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru virtual UBool runTestLoop( char* testname, char* par ); 143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru virtual UBool callTest( UPerfTest& testToBeCalled, char* par ); 145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t _argc; 147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char** _argv; 148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char * _addUsage; 149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char* resolvedFileName; 150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCHARBUF* ucharBuf; 151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char* encoding; 152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool uselen; 153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char* fileName; 154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char* sourceDir; 155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t _remainingArgc; 156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ULine* lines; 157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t numLines; 158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool line_mode; 159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar* buffer; 160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t bufferLen; 161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool verbose; 162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool bulk_mode; 163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t passes; 164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t iterations; 165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t time; 166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char* locale; 167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruprivate: 168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UPerfTest* caller; 169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char* path; // specifies subtests 170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// static members 172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic: 173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru static UPerfTest* gTest; 174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru static const char gUsageString[]; 175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 180