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