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