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