• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /***********************************************************************
2  * © 2016 and later: Unicode, Inc. and others.
3  * License & terms of use: http://www.unicode.org/copyright.html
4  *
5  ***********************************************************************
6  ***********************************************************************
7  * COPYRIGHT:
8  * Copyright (C) 2001-2016 International Business Machines Corporation
9  * and others. All Rights Reserved.
10  *
11  ***********************************************************************/
12 /********************************************************************************
13 *
14 * File ubrkperf.cpp
15 *
16 * Modification History:
17 *        Name                     Description
18 *     Vladimir Weinstein          First Version, based on collperf
19 *
20 *********************************************************************************
21 */
22 
23 #include "cmemory.h"
24 #include "ubrkperf.h"
25 #include "uoptions.h"
26 #include <stdio.h>
27 
28 
29 #if 0
30 #if U_PLATFORM_IS_DARWIN_BASED
31 #include <ApplicationServices/ApplicationServices.h>
32 enum{
33   kUCTextBreakAllMask = (kUCTextBreakClusterMask | kUCTextBreakWordMask | kUCTextBreakLineMask)
34     };
35 UCTextBreakType breakTypes[4] = {kUCTextBreakCharMask, kUCTextBreakClusterMask, kUCTextBreakWordMask, kUCTextBreakLineMask};
36 TextBreakLocatorRef breakRef;
37 UCTextBreakType macBreakType;
38 
39 void createMACBrkIt() {
40   OSStatus status = noErr;
41   LocaleRef lref;
42   status = LocaleRefFromLocaleString(opt_locale, &lref);
43   status = UCCreateTextBreakLocator(lref, 0, kUCTextBreakAllMask, (TextBreakLocatorRef*)&breakRef);
44   if(opt_char == true) {
45     macBreakType = kUCTextBreakClusterMask;
46   } else if(opt_word == true) {
47     macBreakType = kUCTextBreakWordMask;
48   } else if(opt_line == true) {
49     macBreakType = kUCTextBreakLineMask;
50   } else if(opt_sentence == true) {
51     // error
52     // brkit = BreakIterator::createSentenceInstance(opt_locale, status);
53   } else {
54     // default is character iterator
55     macBreakType = kUCTextBreakClusterMask;
56       }
57 }
58 #endif
59 
60 
61 void doForwardTest() {
62   if (opt_terse == false) {
63     printf("Doing the forward test\n");
64   }
65   int32_t noBreaks = 0;
66   int32_t i = 0;
67   unsigned long startTime = timeGetTime();
68   unsigned long elapsedTime = 0;
69   if(opt_icu) {
70     createICUBrkIt();
71     brkit->setText(text);
72     brkit->first();
73     if (opt_terse == false) {
74       printf("Warmup\n");
75     }
76     while(brkit->next() != BreakIterator::DONE) {
77       noBreaks++;
78     }
79 
80     if (opt_terse == false) {
81       printf("Measure\n");
82     }
83     startTime = timeGetTime();
84     for(i = 0; i < opt_loopCount; i++) {
85       brkit->first();
86       while(brkit->next() != BreakIterator::DONE) {
87       }
88     }
89 
90     elapsedTime = timeGetTime()-startTime;
91   } else if(opt_mac) {
92 #if U_PLATFORM_IS_DARWIN_BASED
93     createMACBrkIt();
94     UniChar* filePtr = text;
95     OSStatus status = noErr;
96     UniCharCount startOffset = 0, breakOffset = 0, numUniChars = textSize;
97     startOffset = 0;
98     //printf("\t---Search forward--\n");
99 
100     while (startOffset < numUniChars)
101     {
102 	status = UCFindTextBreak(breakRef, macBreakType, kUCTextBreakLeadingEdgeMask, filePtr, numUniChars,
103                                startOffset, &breakOffset);
104       //require_action(status == noErr, EXIT, printf( "**UCFindTextBreak failed: startOffset %d, status %d\n", (int)startOffset, (int)status));
105       //require_action((breakOffset <= numUniChars),EXIT, printf("**UCFindTextBreak breakOffset too big: startOffset %d, breakOffset %d\n", (int)startOffset, (int)breakOffset));
106 
107       // Output break
108       //printf("\t%d\n", (int)breakOffset);
109 
110       // Increment counters
111 	noBreaks++;
112       startOffset = breakOffset;
113     }
114     startTime = timeGetTime();
115     for(i = 0; i < opt_loopCount; i++) {
116       startOffset = 0;
117 
118       while (startOffset < numUniChars)
119 	{
120 	  status = UCFindTextBreak(breakRef, macBreakType, kUCTextBreakLeadingEdgeMask, filePtr, numUniChars,
121 				   startOffset, &breakOffset);
122 	  // Increment counters
123 	  startOffset = breakOffset;
124 	}
125     }
126     elapsedTime = timeGetTime()-startTime;
127     UCDisposeTextBreakLocator(&breakRef);
128 #endif
129 
130 
131   }
132 
133 
134   if (opt_terse == false) {
135   int32_t loopTime = (int)(float(1000) * ((float)elapsedTime/(float)opt_loopCount));
136       int32_t timePerCU = (int)(float(1000) * ((float)loopTime/(float)textSize));
137       int32_t timePerBreak = (int)(float(1000) * ((float)loopTime/(float)noBreaks));
138       printf("forward break iteration average loop time %d\n", loopTime);
139       printf("number of code units %d average time per code unit %d\n", textSize, timePerCU);
140       printf("number of breaks %d average time per break %d\n", noBreaks, timePerBreak);
141   } else {
142       printf("time=%d\nevents=%d\nsize=%d\n", elapsedTime, noBreaks, textSize);
143   }
144 
145 
146 }
147 
148 
149 
150 
151 #endif
152 
TestICUForward()153 UPerfFunction* BreakIteratorPerformanceTest::TestICUForward()
154 {
155   return new ICUForward(locale, m_mode_, m_file_, m_fileLen_);
156 }
157 
TestICUIsBound()158 UPerfFunction* BreakIteratorPerformanceTest::TestICUIsBound()
159 {
160   return new ICUIsBound(locale, m_mode_, m_file_, m_fileLen_);
161 }
162 
TestDarwinForward()163 UPerfFunction* BreakIteratorPerformanceTest::TestDarwinForward()
164 {
165   return NULL;
166 }
167 
TestDarwinIsBound()168 UPerfFunction* BreakIteratorPerformanceTest::TestDarwinIsBound()
169 {
170   return NULL;
171 }
172 
runIndexedTest(int32_t index,UBool exec,const char * & name,char * par)173 UPerfFunction* BreakIteratorPerformanceTest::runIndexedTest(int32_t index, UBool exec,
174 												   const char *&name,
175 												   char* par)
176 {
177     switch (index) {
178         TESTCASE(0, TestICUForward);
179 		TESTCASE(1, TestICUIsBound);
180 		TESTCASE(2, TestDarwinForward);
181 		TESTCASE(3, TestDarwinIsBound);
182         default:
183             name = "";
184             return NULL;
185     }
186     return NULL;
187 }
188 
189 UOption options[]={
190                       UOPTION_DEF( "mode",        'm', UOPT_REQUIRES_ARG)
191                   };
192 
193 
BreakIteratorPerformanceTest(int32_t argc,const char * argv[],UErrorCode & status)194 BreakIteratorPerformanceTest::BreakIteratorPerformanceTest(int32_t argc, const char* argv[], UErrorCode& status)
195 : UPerfTest(argc,argv,status),
196 m_mode_(NULL),
197 m_file_(NULL),
198 m_fileLen_(0)
199 {
200 
201     _remainingArgc = u_parseArgs(_remainingArgc, (char**)argv, UPRV_LENGTHOF(options), options);
202 
203 
204     if(options[0].doesOccur) {
205       m_mode_ = options[0].value;
206       switch(options[0].value[0]) {
207       case 'w' :
208       case 'c' :
209       case 's' :
210       case 'l' :
211         break;
212       default:
213         status = U_ILLEGAL_ARGUMENT_ERROR;
214         break;
215       }
216     } else {
217       status = U_ILLEGAL_ARGUMENT_ERROR;
218     }
219 
220     m_file_ = getBuffer(m_fileLen_, status);
221 
222     if(status== U_ILLEGAL_ARGUMENT_ERROR){
223        fprintf(stderr, gUsageString, "ubrkperf");
224        fprintf(stderr, "\t-m or --mode        Required mode for breakiterator: char, word, line or sentence\n");
225 
226        return;
227     }
228 
229     if(U_FAILURE(status)){
230         fprintf(stderr, "FAILED to create UPerfTest object. Error: %s\n", u_errorName(status));
231         return;
232     }
233 }
234 
~BreakIteratorPerformanceTest()235 BreakIteratorPerformanceTest::~BreakIteratorPerformanceTest()
236 {
237 }
238 
239 
240 //----------------------------------------------------------------------------------------
241 //
242 //    Main   --  process command line, read in and pre-process the test file,
243 //                 call other functions to do the actual tests.
244 //
245 //----------------------------------------------------------------------------------------
main(int argc,const char ** argv)246 int main(int argc, const char** argv) {
247     UErrorCode status = U_ZERO_ERROR;
248     BreakIteratorPerformanceTest test(argc, argv, status);
249     if(U_FAILURE(status)){
250         return status;
251     }
252     if(test.run()==false){
253         fprintf(stderr,"FAILED: Tests could not be run please check the arguments.\n");
254         return -1;
255     }
256     return 0;
257 }
258