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