OLD | NEW |
(Empty) | |
| 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 */ |
| 85 virtual long getEventsPerIteration(){ |
| 86 return -1; |
| 87 } |
| 88 /** |
| 89 * destructor |
| 90 */ |
| 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 */ |
| 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 |
OLD | NEW |