• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 ***********************************************************************
3 * © 2016 and later: Unicode, Inc. and others.
4 * License & terms of use: http://www.unicode.org/copyright.html#License
5 ***********************************************************************
6 ***********************************************************************
7 * Copyright (c) 2002-2016,International Business Machines
8 * Corporation and others.  All Rights Reserved.
9 ***********************************************************************
10 ***********************************************************************
11 */
12 
13 #ifndef _DATEFMTPERF_H
14 #define _DATEFMTPERF_H
15 
16 #include "cmemory.h"
17 #include "unicode/stringpiece.h"
18 #include "unicode/unistr.h"
19 #include "unicode/uperf.h"
20 
21 #include "unicode/dtitvfmt.h"
22 #include "unicode/utypes.h"
23 #include "unicode/datefmt.h"
24 #include "unicode/calendar.h"
25 #include "unicode/uclean.h"
26 #include "unicode/brkiter.h"
27 #include "unicode/numfmt.h"
28 #include "unicode/coll.h"
29 #include "util.h"
30 
31 #include "datedata.h"
32 #include "breakdata.h"
33 #include "collationdata.h"
34 
35 #include <stdlib.h>
36 #include <string.h>
37 
38 #include <fstream>
39 
40 #include <iostream>
41 using namespace std;
42 
43 //  Stubs for Windows API functions when building on UNIXes.
44 //
45 #if U_PLATFORM_USES_ONLY_WIN32_API
46 // do nothing
47 #else
48 #define _UNICODE
49 typedef int DWORD;
50 inline int FoldStringW(DWORD dwMapFlags, const UChar* lpSrcStr,int cchSrc, UChar* lpDestStr,int cchDest);
51 #endif
52 
53 class BreakItFunction : public UPerfFunction
54 {
55 private:
56 	int num;
57 	bool wordIteration;
58 
59 public:
60 
BreakItFunction()61 	BreakItFunction(){num = -1;}
BreakItFunction(int a,bool b)62 	BreakItFunction(int a, bool b){num = a; wordIteration = b;}
63 
call(UErrorCode * status)64 	virtual void call(UErrorCode * status)
65 	{
66 		BreakIterator* boundary;
67 
68 		if(wordIteration)
69 		{
70 			for(int i = 0; i < num; i++)
71 			{
72 				boundary = BreakIterator::createWordInstance("en", *status);
73 				boundary->setText(str);
74 
75 				int32_t start = boundary->first();
76 				for (int32_t end = boundary->next();
77 					 end != BreakIterator::DONE;
78 					 start = end, end = boundary->next())
79 				{
80 					printTextRange( *boundary, start, end );
81 				}
82 			}
83 		}
84 
85 		else // character iteration
86 		{
87 			for(int i = 0; i < num; i++)
88             {
89 				boundary = BreakIterator::createCharacterInstance(Locale::getUS(), *status);
90 				boundary->setText(str);
91 
92 				int32_t start = boundary->first();
93 				for (int32_t end = boundary->next();
94 					 end != BreakIterator::DONE;
95 					 start = end, end = boundary->next())
96 				{
97 					printTextRange( *boundary, start, end );
98 				}
99 			}
100 		}
101 
102 
103 	}
104 
getOperationsPerIteration()105 	virtual long getOperationsPerIteration()
106 	{
107 		if(wordIteration) return 125*num;
108 		else return 355*num;
109 	}
110 
printUnicodeString(const UnicodeString & s)111 	void printUnicodeString(const UnicodeString &s) {
112 		char charBuf[1000];
113 		s.extract(0, s.length(), charBuf, sizeof(charBuf)-1, 0);
114 		charBuf[sizeof(charBuf)-1] = 0;
115 		printf("%s", charBuf);
116 	}
117 
118 
printTextRange(BreakIterator & iterator,int32_t start,int32_t end)119 	void printTextRange( BreakIterator& iterator,
120 						int32_t start, int32_t end )
121 	{
122 		CharacterIterator *strIter = iterator.getText().clone();
123 		UnicodeString  s;
124 		strIter->getText(s);
125 		//printUnicodeString(UnicodeString(s, start, end-start));
126 		//puts("");
127 		delete strIter;
128 	}
129 
130 	// Print the given string to stdout (for debugging purposes)
uprintf(const UnicodeString & str)131 	void uprintf(const UnicodeString &str) {
132 		char *buf = 0;
133 		int32_t len = str.length();
134 		int32_t bufLen = len + 16;
135 		int32_t actualLen;
136 		buf = new char[bufLen + 1];
137 		actualLen = str.extract(0, len, buf/*, bufLen*/); // Default codepage conversion
138 		buf[actualLen] = 0;
139 		printf("%s", buf);
140 		delete[] buf;
141 	}
142 
143 };
144 
145 class DateFmtFunction : public UPerfFunction
146 {
147 
148 private:
149 	int num;
150     char locale[25];
151 public:
152 
DateFmtFunction()153 	DateFmtFunction()
154 	{
155 		num = -1;
156 	}
157 
DateFmtFunction(int a,const char * loc)158 	DateFmtFunction(int a, const char* loc)
159 	{
160 		num = a;
161         strcpy(locale, loc);
162 	}
163 
call(UErrorCode * status)164 	virtual void call(UErrorCode* status)
165 	{
166 
167 		UErrorCode status2 = U_ZERO_ERROR;
168 		Calendar *cal;
169 		TimeZone *zone;
170 		UnicodeString str;
171 		UDate date;
172 
173 		cal = Calendar::createInstance(status2);
174 		check(status2, "Calendar::createInstance");
175 		zone = TimeZone::createTimeZone("GMT"); // Create a GMT zone
176 		cal->adoptTimeZone(zone);
177 
178 		Locale loc(locale);
179 		DateFormat *fmt;
180 		fmt = DateFormat::createDateTimeInstance(
181 								DateFormat::kShort, DateFormat::kFull, loc);
182 
183 
184 		// (dates are imported from datedata.h)
185 		for(int j = 0; j < num; j++)
186 			for(int i = 0; i < NUM_DATES; i++)
187 			{
188 				cal->clear();
189 				cal->set(years[i], months[i], days[i]);
190 				date = cal->getTime(status2);
191 				check(status2, "Calendar::getTime");
192 
193 				fmt->setCalendar(*cal);
194 
195 				// Format the date
196 				str.remove();
197 				fmt->format(date, str, status2);
198 
199 
200 				// Display the formatted date string
201 				//uprintf(str);
202 				//printf("\n");
203 
204 			}
205 
206 		delete fmt;
207 		delete cal;
208 		//u_cleanup();
209 	}
210 
getOperationsPerIteration()211 	virtual long getOperationsPerIteration()
212 	{
213 		return NUM_DATES * num;
214 	}
215 
216 	// Print the given string to stdout (for debugging purposes)
uprintf(const UnicodeString & str)217 	void uprintf(const UnicodeString &str) {
218 		char *buf = 0;
219 		int32_t len = str.length();
220 		int32_t bufLen = len + 16;
221 		int32_t actualLen;
222 		buf = new char[bufLen + 1];
223 		actualLen = str.extract(0, len, buf/*, bufLen*/); // Default codepage conversion
224 		buf[actualLen] = 0;
225 		printf("%s", buf);
226 		delete[] buf;
227 	}
228 
229 	// Verify that a UErrorCode is successful; exit(1) if not
check(UErrorCode & status,const char * msg)230 	void check(UErrorCode& status, const char* msg) {
231 		if (U_FAILURE(status)) {
232 			printf("ERROR: %s (%s)\n", u_errorName(status), msg);
233 			exit(1);
234 		}
235 	}
236 
237 };
238 
239 class DateFmtCreateFunction : public UPerfFunction
240 {
241 
242 private:
243         int num;
244         char locale[25];
245 public:
246 
DateFmtCreateFunction(int a,const char * loc)247         DateFmtCreateFunction(int a, const char* loc)
248         {
249                 num = a;
250                 strcpy(locale, loc);
251         }
252 
call(UErrorCode *)253         virtual void call(UErrorCode* /* status */)
254         {
255 
256                 Locale loc(locale);
257                 DateFormat *fmt;
258                 // (dates are imported from datedata.h)
259                 for(int j = 0; j < num; j++) {
260                     fmt = DateFormat::createDateTimeInstance(
261                             DateFormat::kShort, DateFormat::kFull, loc);
262                     delete fmt;
263                 }
264         }
265 
getOperationsPerIteration()266         virtual long getOperationsPerIteration()
267         {
268                 return num;
269         }
270 
271 };
272 
273 class DateFmtCopyFunction : public UPerfFunction
274 {
275 
276 private:
277         int num;
278     char locale[25];
279 public:
280 
DateFmtCopyFunction()281         DateFmtCopyFunction()
282         {
283                 num = -1;
284         }
285 
DateFmtCopyFunction(int a,const char * loc)286         DateFmtCopyFunction(int a, const char* loc)
287         {
288                 num = a;
289         strcpy(locale, loc);
290         }
291 
call(UErrorCode *)292         virtual void call(UErrorCode* /* status */)
293         {
294                 Locale loc(locale);
295                 UErrorCode status2 = U_ZERO_ERROR;
296                 DateFormat *fmt = DateFormat::createDateTimeInstance(
297                             DateFormat::kShort, DateFormat::kFull, loc);
298                 for(int j = 0; j < num; j++) {
299                     Format *cp = fmt->clone();
300                     delete cp;
301                 }
302                 delete fmt;
303         }
304 
getOperationsPerIteration()305         virtual long getOperationsPerIteration()
306         {
307                 return num;
308         }
309 
310         // Verify that a UErrorCode is successful; exit(1) if not
check(UErrorCode & status,const char * msg)311         void check(UErrorCode& status, const char* msg) {
312                 if (U_FAILURE(status)) {
313                         printf("ERROR: %s (%s)\n", u_errorName(status), msg);
314                         exit(1);
315                 }
316         }
317 
318 };
319 
320 class DIFCreateFunction : public UPerfFunction
321 {
322 
323 private:
324 	int num;
325     char locale[25];
326 public:
327 
DIFCreateFunction()328 	DIFCreateFunction()
329 	{
330 		num = -1;
331 	}
332 
DIFCreateFunction(int a,const char * loc)333 	DIFCreateFunction(int a, const char* loc)
334 	{
335 		num = a;
336         strcpy(locale, loc);
337 	}
338 
call(UErrorCode *)339 	virtual void call(UErrorCode* /* status */)
340 	{
341 		UErrorCode status2 = U_ZERO_ERROR;
342 		Calendar *cal;
343 		TimeZone *zone;
344 
345 		cal = Calendar::createInstance(status2);
346 		check(status2, "Calendar::createInstance");
347 		zone = TimeZone::createTimeZone("GMT"); // Create a GMT zone
348 		cal->adoptTimeZone(zone);
349 
350 		Locale loc(locale);
351                 UnicodeString skeleton("yMMMMdHms");
352 
353 		for(int j = 0; j < num; j++) {
354                     DateIntervalFormat* fmt(DateIntervalFormat::createInstance(skeleton, loc, status2));
355                     delete fmt;
356                 }
357                 delete cal;
358 	}
359 
getOperationsPerIteration()360 	virtual long getOperationsPerIteration()
361 	{
362 		return num;
363 	}
364 
365 	// Verify that a UErrorCode is successful; exit(1) if not
check(UErrorCode & status,const char * msg)366 	void check(UErrorCode& status, const char* msg) {
367 		if (U_FAILURE(status)) {
368 			printf("ERROR: %s (%s)\n", u_errorName(status), msg);
369 			exit(1);
370 		}
371 	}
372 
373 };
374 
375 class TimeZoneCreateFunction : public UPerfFunction
376 {
377 
378 private:
379 	int num;
380     char locale[25];
381 public:
382 
TimeZoneCreateFunction()383 	TimeZoneCreateFunction()
384 	{
385 		num = -1;
386 	}
387 
TimeZoneCreateFunction(int a,const char * loc)388 	TimeZoneCreateFunction(int a, const char* loc)
389 	{
390 		num = a;
391         strcpy(locale, loc);
392 	}
393 
call(UErrorCode *)394 	virtual void call(UErrorCode* /* status */)
395 	{
396 		Locale loc(locale);
397                 UnicodeString tzname("UTC");
398 		for(int j = 0; j < num; j++) {
399                     TimeZone* tz(TimeZone::createTimeZone(tzname));
400                     delete tz;
401                 }
402 	}
403 
getOperationsPerIteration()404 	virtual long getOperationsPerIteration()
405 	{
406 		return num;
407 	}
408 
409 	// Verify that a UErrorCode is successful; exit(1) if not
check(UErrorCode & status,const char * msg)410 	void check(UErrorCode& status, const char* msg) {
411 		if (U_FAILURE(status)) {
412 			printf("ERROR: %s (%s)\n", u_errorName(status), msg);
413 			exit(1);
414 		}
415 	}
416 
417 };
418 
419 class DTPatternGeneratorCreateFunction : public UPerfFunction
420 {
421 
422 private:
423 	int num;
424     char locale[25];
425 public:
426 
DTPatternGeneratorCreateFunction()427 	DTPatternGeneratorCreateFunction()
428 	{
429 		num = -1;
430 	}
431 
DTPatternGeneratorCreateFunction(int a,const char * loc)432 	DTPatternGeneratorCreateFunction(int a, const char* loc)
433 	{
434 		num = a;
435         strcpy(locale, loc);
436 	}
437 
call(UErrorCode *)438 	virtual void call(UErrorCode* /* status */)
439 	{
440 		UErrorCode status2 = U_ZERO_ERROR;
441 		Locale loc(locale);
442 
443 		for(int j = 0; j < num; j++) {
444                     DateTimePatternGenerator* gen(DateTimePatternGenerator::createInstance(loc, status2));
445                     delete gen;
446                 }
447 	}
448 
getOperationsPerIteration()449 	virtual long getOperationsPerIteration()
450 	{
451 		return num;
452 	}
453 
454 	// Verify that a UErrorCode is successful; exit(1) if not
check(UErrorCode & status,const char * msg)455 	void check(UErrorCode& status, const char* msg) {
456 		if (U_FAILURE(status)) {
457 			printf("ERROR: %s (%s)\n", u_errorName(status), msg);
458 			exit(1);
459 		}
460 	}
461 
462 };
463 
464 class DTPatternGeneratorCopyFunction : public UPerfFunction
465 {
466 
467 private:
468 	int num;
469     char locale[25];
470 public:
471 
DTPatternGeneratorCopyFunction()472 	DTPatternGeneratorCopyFunction()
473 	{
474 		num = -1;
475 	}
476 
DTPatternGeneratorCopyFunction(int a,const char * loc)477 	DTPatternGeneratorCopyFunction(int a, const char* loc)
478 	{
479 		num = a;
480         strcpy(locale, loc);
481 	}
482 
call(UErrorCode *)483 	virtual void call(UErrorCode* /* status */)
484 	{
485 		UErrorCode status2 = U_ZERO_ERROR;
486 		Locale loc(locale);
487                 DateTimePatternGenerator* gen(DateTimePatternGenerator::createInstance(loc, status2));
488 
489 		for(int j = 0; j < num; j++) {
490                     DateTimePatternGenerator *cl = gen->clone();
491                     delete cl;
492                 }
493                 delete gen;
494 	}
495 
getOperationsPerIteration()496 	virtual long getOperationsPerIteration()
497 	{
498 		return num;
499 	}
500 
501 	// Verify that a UErrorCode is successful; exit(1) if not
check(UErrorCode & status,const char * msg)502 	void check(UErrorCode& status, const char* msg) {
503 		if (U_FAILURE(status)) {
504 			printf("ERROR: %s (%s)\n", u_errorName(status), msg);
505 			exit(1);
506 		}
507 	}
508 
509 };
510 
511 class DTPatternGeneratorBestValueFunction : public UPerfFunction
512 {
513 
514 private:
515 	int num;
516     char locale[25];
517 public:
518 
DTPatternGeneratorBestValueFunction()519 	DTPatternGeneratorBestValueFunction()
520 	{
521 		num = -1;
522 	}
523 
DTPatternGeneratorBestValueFunction(int a,const char * loc)524 	DTPatternGeneratorBestValueFunction(int a, const char* loc)
525 	{
526 		num = a;
527         strcpy(locale, loc);
528 	}
529 
call(UErrorCode *)530 	virtual void call(UErrorCode* /* status */)
531 	{
532 		UErrorCode status2 = U_ZERO_ERROR;
533 		Locale loc(locale);
534                 DateTimePatternGenerator* gen(DateTimePatternGenerator::createInstance(loc, status2));
535                 UnicodeString skeleton("yMMMMdHms");
536 
537 		for(int j = 0; j < num; j++) {
538                     gen->getBestPattern(skeleton, status2);
539                 }
540                 check(status2, "getBestPattern");
541                 delete gen;
542 	}
543 
getOperationsPerIteration()544 	virtual long getOperationsPerIteration()
545 	{
546 		return num;
547 	}
548 
549 	// Verify that a UErrorCode is successful; exit(1) if not
check(UErrorCode & status,const char * msg)550 	void check(UErrorCode& status, const char* msg) {
551 		if (U_FAILURE(status)) {
552 			printf("ERROR: %s (%s)\n", u_errorName(status), msg);
553 			exit(1);
554 		}
555 	}
556 
557 };
558 
559 class NumFmtFunction : public UPerfFunction
560 {
561 
562 private:
563 	int num;
564     char locale[25];
565 public:
566 
NumFmtFunction()567 	NumFmtFunction()
568 	{
569 		num = -1;
570 	}
571 
NumFmtFunction(int a,const char * loc)572 	NumFmtFunction(int a, const char* loc)
573 	{
574 		num = a;
575         strcpy(locale, loc);
576 	}
577 
call(UErrorCode * status2)578 	virtual void call(UErrorCode* status2)
579 	{
580         Locale loc(locale);
581         UErrorCode status = U_ZERO_ERROR;
582 
583         // Create a number formatter for the locale
584         NumberFormat *fmt = NumberFormat::createInstance(loc, status);
585 
586         // Parse a string.  The string uses the digits '0' through '9'
587         // and the decimal separator '.', standard in the US locale
588 
589         for(int i = 0; i < num; i++)
590         {
591             UnicodeString str("9876543210.123");
592             Formattable result;
593             fmt->parse(str, result, status);
594 
595             //uprintf(formattableToString(result));
596             //printf("\n");
597 
598             // Take the number parsed above, and use the formatter to
599             // format it.
600             str.remove(); // format() will APPEND to this string
601             fmt->format(result, str, status);
602 
603             //uprintf(str);
604             //printf("\n");
605         }
606 
607         delete fmt; // Release the storage used by the formatter
608     }
609 
610     enum {
611         U_SPACE=0x20,
612         U_DQUOTE=0x22,
613         U_COMMA=0x2c,
614         U_LEFT_SQUARE_BRACKET=0x5b,
615         U_BACKSLASH=0x5c,
616         U_RIGHT_SQUARE_BRACKET=0x5d,
617         U_SMALL_U=0x75
618     };
619 
620     // Create a display string for a formattable
formattableToString(const Formattable & f)621     UnicodeString formattableToString(const Formattable& f) {
622         switch (f.getType()) {
623         case Formattable::kDate:
624             // TODO: Finish implementing this
625             return UNICODE_STRING_SIMPLE("Formattable_DATE_TBD");
626         case Formattable::kDouble:
627             {
628                 char buf[256];
629                 sprintf(buf, "%gD", f.getDouble());
630                 return UnicodeString(buf, "");
631             }
632         case Formattable::kLong:
633         case Formattable::kInt64:
634             {
635                 char buf[256];
636                 sprintf(buf, "%ldL", f.getLong());
637                 return UnicodeString(buf, "");
638             }
639         case Formattable::kString:
640             return UnicodeString((UChar)U_DQUOTE).append(f.getString()).append((UChar)U_DQUOTE);
641         case Formattable::kArray:
642             {
643                 int32_t i, count;
644                 const Formattable* array = f.getArray(count);
645                 UnicodeString result((UChar)U_LEFT_SQUARE_BRACKET);
646                 for (i=0; i<count; ++i) {
647                     if (i > 0) {
648                         (result += (UChar)U_COMMA) += (UChar)U_SPACE;
649                     }
650                     result += formattableToString(array[i]);
651                 }
652                 result += (UChar)U_RIGHT_SQUARE_BRACKET;
653                 return result;
654             }
655         default:
656             return UNICODE_STRING_SIMPLE("INVALID_Formattable");
657         }
658     }
659 
getOperationsPerIteration()660 	virtual long getOperationsPerIteration()
661 	{
662 		return num;
663 	}
664 
665     // Print the given string to stdout using the UTF-8 converter (for debugging purposes only)
uprintf(const UnicodeString & str)666     void uprintf(const UnicodeString &str) {
667         char stackBuffer[100];
668         char *buf = 0;
669 
670         int32_t bufLen = str.extract(0, 0x7fffffff, stackBuffer, sizeof(stackBuffer), "UTF-8");
671         if(bufLen < sizeof(stackBuffer)) {
672             buf = stackBuffer;
673         } else {
674             buf = new char[bufLen + 1];
675             bufLen = str.extract(0, 0x7fffffff, buf, bufLen + 1, "UTF-8");
676         }
677         printf("%s", buf);
678         if(buf != stackBuffer) {
679             delete[] buf;
680         }
681     }
682 };
683 
684 
685 
686 #define NUM_STRING "9876543210.123"
687 #define NUM_NUM 9876543210.123
688 class StdioNumFmtFunction : public UPerfFunction
689 {
690 
691  private:
692   int num;
693   char locale[25];
694  public:
695 
StdioNumFmtFunction()696   StdioNumFmtFunction()
697     {
698       num = -1;
699     }
700 
StdioNumFmtFunction(int a,const char * loc)701   StdioNumFmtFunction(int a, const char* loc)
702     {
703       num = a;
704       strcpy(locale, loc);
705     }
706 
call(UErrorCode * status2)707   virtual void call(UErrorCode* status2)
708   {
709     Locale loc(locale);
710     UErrorCode status = U_ZERO_ERROR;
711 
712     // Parse a string.  The string uses the digits '0' through '9'
713     // and the decimal separator '.', standard in the US locale
714 
715     double result;
716     char outbuf[500];
717     const char *str = NUM_STRING;
718 
719     for(int i = 0; i < num; i++)
720       {
721         if(sscanf(str, "%lg", &result)!=1) {
722           cout << "Failed Stdio: failed to sscanf" << endl;
723           *status2 = U_PARSE_ERROR;
724           return;
725         }
726 
727         sprintf(outbuf, "%lg", result);
728       }
729 
730     if(result!=NUM_NUM) {
731       cout << "Failed Stdio: sscanf got wrong result, expected " << NUM_NUM << " got " << result << endl;
732       *status2 = U_PARSE_ERROR;
733     }
734     if(strcmp(str,NUM_STRING)) {
735       cout << "Failed Stdio: sprintf got wrong result, expected " << NUM_STRING << " got " << str << endl;
736       *status2 = U_PARSE_ERROR;
737     }
738   }
739 
getOperationsPerIteration()740   virtual long getOperationsPerIteration()
741   {
742     return num;
743   }
744 
745 };
746 
747 class CollationFunction : public UPerfFunction
748 {
749 
750 private:
751 	int num;
752     char locale[25];
753 	UnicodeString *collation_strings;
754 
755 	/**
756 	 * Unescape the strings
757 	 */
init()758 	void init() {
759         uint32_t listSize = UPRV_LENGTHOF(collation_strings_escaped);
760 		collation_strings = new UnicodeString[listSize];
761 		for(uint32_t k=0;k<listSize;k++) {
762 			collation_strings[k] = collation_strings_escaped[k].unescape();
763 		}
764 		UnicodeString shorty((UChar32)0x12345);
765 	}
766 public:
767 
CollationFunction()768 	CollationFunction()
769 	{
770 		num = -1;
771 
772 		init();
773 	}
774 
~CollationFunction()775 	~CollationFunction() {
776 		delete [] collation_strings;
777 	}
778 
CollationFunction(int a,const char * loc)779 	CollationFunction(int a, const char* loc)
780 	{
781 		num = a;
782         strcpy(locale, loc);
783 		init();
784 	}
785 
call(UErrorCode * status2)786 	virtual void call(UErrorCode* status2)
787 	{
788         uint32_t listSize = UPRV_LENGTHOF(collation_strings_escaped);
789         UErrorCode status = U_ZERO_ERROR;
790         Collator *coll = Collator::createInstance(Locale(locale), status);
791 
792         for(int k = 0; k < num; k++)
793         {
794             uint32_t i, j;
795             for(i=listSize-1; i>=1; i--) {
796                 for(j=0; j<i; j++) {
797                     if(coll->compare(collation_strings[j], collation_strings[j+1]) == UCOL_LESS) {
798                     //cout << "Success!" << endl;
799                      }
800                 }
801             }
802          }
803         delete coll;
804     }
805 
getOperationsPerIteration()806 	virtual long getOperationsPerIteration()
807 	{
808 		return num;
809 	}
810 };
811 
812 class DateFormatPerfTest : public UPerfTest
813 {
814 private:
815 
816 public:
817 
818 	DateFormatPerfTest(int32_t argc, const char* argv[], UErrorCode& status);
819 	~DateFormatPerfTest();
820 	virtual UPerfFunction* runIndexedTest(int32_t index, UBool exec,const char* &name, char* par);
821 
822 	UPerfFunction* DateFmt250();
823 	UPerfFunction* DateFmt10000();
824 	UPerfFunction* DateFmt100000();
825 	UPerfFunction* DateFmtCreate250();
826 	UPerfFunction* DateFmtCreate10000();
827 	UPerfFunction* DateFmtCopy250();
828 	UPerfFunction* DateFmtCopy10000();
829 	UPerfFunction* BreakItWord250();
830 	UPerfFunction* BreakItWord10000();
831 	UPerfFunction* BreakItChar250();
832 	UPerfFunction* BreakItChar10000();
833     UPerfFunction* NumFmt10000();
834     UPerfFunction* NumFmt100000();
835     UPerfFunction* Collation10000();
836     UPerfFunction* Collation100000();
837     UPerfFunction* DIFCreate250();
838     UPerfFunction* DIFCreate10000();
839     UPerfFunction* TimeZoneCreate250();
840     UPerfFunction* TimeZoneCreate10000();
841     UPerfFunction* DTPatternGeneratorCreate250();
842     UPerfFunction* DTPatternGeneratorCreate10000();
843     UPerfFunction* DTPatternGeneratorCopy250();
844     UPerfFunction* DTPatternGeneratorCopy10000();
845     UPerfFunction* DTPatternGeneratorBestValue250();
846     UPerfFunction* DTPatternGeneratorBestValue10000();
847 };
848 
849 #endif // DateFmtPerf
850