Index: icu46/source/test/perf/DateFmtPerf/DateFmtPerf.h |
=================================================================== |
--- icu46/source/test/perf/DateFmtPerf/DateFmtPerf.h (revision 0) |
+++ icu46/source/test/perf/DateFmtPerf/DateFmtPerf.h (revision 0) |
@@ -0,0 +1,446 @@ |
+/* |
+********************************************************************** |
+* Copyright (c) 2002-2010,International Business Machines |
+* Corporation and others. All Rights Reserved. |
+********************************************************************** |
+********************************************************************** |
+*/ |
+ |
+#ifndef _DATEFMTPERF_H |
+#define _DATEFMTPERF_H |
+ |
+ |
+#include "unicode/stringpiece.h" |
+#include "unicode/unistr.h" |
+#include "unicode/uperf.h" |
+ |
+#include "unicode/utypes.h" |
+#include "unicode/datefmt.h" |
+#include "unicode/calendar.h" |
+#include "unicode/uclean.h" |
+#include "unicode/brkiter.h" |
+#include "unicode/numfmt.h" |
+#include "unicode/coll.h" |
+#include "util.h" |
+ |
+#include "datedata.h" |
+#include "breakdata.h" |
+#include "collationdata.h" |
+ |
+#include <stdlib.h> |
+#include <fstream> |
+#include <string> |
+ |
+#include <iostream> |
+using namespace std; |
+ |
+// Stubs for Windows API functions when building on UNIXes. |
+// |
+#if defined(U_WINDOWS) |
+// do nothing |
+#else |
+#define _UNICODE |
+typedef int DWORD; |
+inline int FoldStringW(DWORD dwMapFlags, const UChar* lpSrcStr,int cchSrc, UChar* lpDestStr,int cchDest); |
+#endif |
+ |
+class BreakItFunction : public UPerfFunction |
+{ |
+private: |
+ int num; |
+ bool wordIteration; |
+ |
+public: |
+ |
+ BreakItFunction(){num = -1;} |
+ BreakItFunction(int a, bool b){num = a; wordIteration = b;} |
+ |
+ virtual void call(UErrorCode *status) |
+ { |
+ BreakIterator* boundary; |
+ |
+ if(wordIteration) |
+ { |
+ for(int i = 0; i < num; i++) |
+ { |
+ boundary = BreakIterator::createWordInstance("en", *status); |
+ boundary->setText(str); |
+ |
+ int32_t start = boundary->first(); |
+ for (int32_t end = boundary->next(); |
+ end != BreakIterator::DONE; |
+ start = end, end = boundary->next()) |
+ { |
+ printTextRange( *boundary, start, end ); |
+ } |
+ } |
+ } |
+ |
+ else // character iteration |
+ { |
+ for(int i = 0; i < num; i++) |
+ { |
+ boundary = BreakIterator::createCharacterInstance(Locale::getUS(), *status); |
+ boundary->setText(str); |
+ |
+ int32_t start = boundary->first(); |
+ for (int32_t end = boundary->next(); |
+ end != BreakIterator::DONE; |
+ start = end, end = boundary->next()) |
+ { |
+ printTextRange( *boundary, start, end ); |
+ } |
+ } |
+ } |
+ |
+ |
+ } |
+ |
+ virtual long getOperationsPerIteration() |
+ { |
+ if(wordIteration) return 125*num; |
+ else return 355*num; |
+ } |
+ |
+ void printUnicodeString(const UnicodeString &s) { |
+ char charBuf[1000]; |
+ s.extract(0, s.length(), charBuf, sizeof(charBuf)-1, 0); |
+ charBuf[sizeof(charBuf)-1] = 0; |
+ printf("%s", charBuf); |
+ } |
+ |
+ |
+ void printTextRange( BreakIterator& iterator, |
+ int32_t start, int32_t end ) |
+ { |
+ CharacterIterator *strIter = iterator.getText().clone(); |
+ UnicodeString s; |
+ strIter->getText(s); |
+ //printUnicodeString(UnicodeString(s, start, end-start)); |
+ //puts(""); |
+ delete strIter; |
+ } |
+ |
+ // Print the given string to stdout (for debugging purposes) |
+ void uprintf(const UnicodeString &str) { |
+ char *buf = 0; |
+ int32_t len = str.length(); |
+ int32_t bufLen = len + 16; |
+ int32_t actualLen; |
+ buf = new char[bufLen + 1]; |
+ actualLen = str.extract(0, len, buf/*, bufLen*/); // Default codepage conversion |
+ buf[actualLen] = 0; |
+ printf("%s", buf); |
+ delete[] buf; |
+ } |
+ |
+}; |
+ |
+class DateFmtFunction : public UPerfFunction |
+{ |
+ |
+private: |
+ int num; |
+ char locale[25]; |
+public: |
+ |
+ DateFmtFunction() |
+ { |
+ num = -1; |
+ } |
+ |
+ DateFmtFunction(int a, const char* loc) |
+ { |
+ num = a; |
+ strcpy(locale, loc); |
+ } |
+ |
+ virtual void call(UErrorCode* status) |
+ { |
+ |
+ UErrorCode status2 = U_ZERO_ERROR; |
+ Calendar *cal; |
+ TimeZone *zone; |
+ UnicodeString str; |
+ UDate date; |
+ |
+ cal = Calendar::createInstance(status2); |
+ check(status2, "Calendar::createInstance"); |
+ zone = TimeZone::createTimeZone("GMT"); // Create a GMT zone |
+ cal->adoptTimeZone(zone); |
+ |
+ Locale loc(locale); |
+ DateFormat *fmt; |
+ fmt = DateFormat::createDateTimeInstance( |
+ DateFormat::kShort, DateFormat::kFull, loc); |
+ |
+ |
+ // (dates are imported from datedata.h) |
+ for(int j = 0; j < num; j++) |
+ for(int i = 0; i < NUM_DATES; i++) |
+ { |
+ cal->clear(); |
+ cal->set(years[i], months[i], days[i]); |
+ date = cal->getTime(status2); |
+ check(status2, "Calendar::getTime"); |
+ |
+ fmt->setCalendar(*cal); |
+ |
+ // Format the date |
+ str.remove(); |
+ fmt->format(date, str, status2); |
+ |
+ |
+ // Display the formatted date string |
+ //uprintf(str); |
+ //printf("\n"); |
+ |
+ } |
+ |
+ delete fmt; |
+ delete cal; |
+ //u_cleanup(); |
+ } |
+ |
+ virtual long getOperationsPerIteration() |
+ { |
+ return NUM_DATES * num; |
+ } |
+ |
+ // Print the given string to stdout (for debugging purposes) |
+ void uprintf(const UnicodeString &str) { |
+ char *buf = 0; |
+ int32_t len = str.length(); |
+ int32_t bufLen = len + 16; |
+ int32_t actualLen; |
+ buf = new char[bufLen + 1]; |
+ actualLen = str.extract(0, len, buf/*, bufLen*/); // Default codepage conversion |
+ buf[actualLen] = 0; |
+ printf("%s", buf); |
+ delete[] buf; |
+ } |
+ |
+ // Verify that a UErrorCode is successful; exit(1) if not |
+ void check(UErrorCode& status, const char* msg) { |
+ if (U_FAILURE(status)) { |
+ printf("ERROR: %s (%s)\n", u_errorName(status), msg); |
+ exit(1); |
+ } |
+ } |
+ |
+}; |
+ |
+class NumFmtFunction : public UPerfFunction |
+{ |
+ |
+private: |
+ int num; |
+ char locale[25]; |
+public: |
+ |
+ NumFmtFunction() |
+ { |
+ num = -1; |
+ } |
+ |
+ NumFmtFunction(int a, const char* loc) |
+ { |
+ num = a; |
+ strcpy(locale, loc); |
+ } |
+ |
+ virtual void call(UErrorCode* status2) |
+ { |
+ Locale loc(locale); |
+ UErrorCode status = U_ZERO_ERROR; |
+ |
+ // Create a number formatter for the locale |
+ NumberFormat *fmt = NumberFormat::createInstance(loc, status); |
+ |
+ // Parse a string. The string uses the digits '0' through '9' |
+ // and the decimal separator '.', standard in the US locale |
+ |
+ for(int i = 0; i < num; i++) |
+ { |
+ UnicodeString str("9876543210.123"); |
+ Formattable result; |
+ fmt->parse(str, result, status); |
+ |
+ //uprintf(formattableToString(result)); |
+ //printf("\n"); |
+ |
+ // Take the number parsed above, and use the formatter to |
+ // format it. |
+ str.remove(); // format() will APPEND to this string |
+ fmt->format(result, str, status); |
+ |
+ //uprintf(str); |
+ //printf("\n"); |
+ } |
+ |
+ delete fmt; // Release the storage used by the formatter |
+ } |
+ |
+ enum { |
+ U_SPACE=0x20, |
+ U_DQUOTE=0x22, |
+ U_COMMA=0x2c, |
+ U_LEFT_SQUARE_BRACKET=0x5b, |
+ U_BACKSLASH=0x5c, |
+ U_RIGHT_SQUARE_BRACKET=0x5d, |
+ U_SMALL_U=0x75 |
+ }; |
+ |
+ // Create a display string for a formattable |
+ UnicodeString formattableToString(const Formattable& f) { |
+ switch (f.getType()) { |
+ case Formattable::kDate: |
+ // TODO: Finish implementing this |
+ return UNICODE_STRING_SIMPLE("Formattable_DATE_TBD"); |
+ case Formattable::kDouble: |
+ { |
+ char buf[256]; |
+ sprintf(buf, "%gD", f.getDouble()); |
+ return UnicodeString(buf, ""); |
+ } |
+ case Formattable::kLong: |
+ case Formattable::kInt64: |
+ { |
+ char buf[256]; |
+ sprintf(buf, "%ldL", f.getLong()); |
+ return UnicodeString(buf, ""); |
+ } |
+ case Formattable::kString: |
+ return UnicodeString((UChar)U_DQUOTE).append(f.getString()).append((UChar)U_DQUOTE); |
+ case Formattable::kArray: |
+ { |
+ int32_t i, count; |
+ const Formattable* array = f.getArray(count); |
+ UnicodeString result((UChar)U_LEFT_SQUARE_BRACKET); |
+ for (i=0; i<count; ++i) { |
+ if (i > 0) { |
+ (result += (UChar)U_COMMA) += (UChar)U_SPACE; |
+ } |
+ result += formattableToString(array[i]); |
+ } |
+ result += (UChar)U_RIGHT_SQUARE_BRACKET; |
+ return result; |
+ } |
+ default: |
+ return UNICODE_STRING_SIMPLE("INVALID_Formattable"); |
+ } |
+ } |
+ |
+ virtual long getOperationsPerIteration() |
+ { |
+ return num; |
+ } |
+ |
+ // Print the given string to stdout using the UTF-8 converter (for debugging purposes only) |
+ void uprintf(const UnicodeString &str) { |
+ char stackBuffer[100]; |
+ char *buf = 0; |
+ |
+ int32_t bufLen = str.extract(0, 0x7fffffff, stackBuffer, sizeof(stackBuffer), "UTF-8"); |
+ if(bufLen < sizeof(stackBuffer)) { |
+ buf = stackBuffer; |
+ } else { |
+ buf = new char[bufLen + 1]; |
+ bufLen = str.extract(0, 0x7fffffff, buf, bufLen + 1, "UTF-8"); |
+ } |
+ printf("%s", buf); |
+ if(buf != stackBuffer) { |
+ delete[] buf; |
+ } |
+ } |
+}; |
+ |
+class CollationFunction : public UPerfFunction |
+{ |
+ |
+private: |
+ int num; |
+ char locale[25]; |
+ UnicodeString *collation_strings; |
+ |
+ /** |
+ * Unescape the strings |
+ */ |
+ void init() { |
+ uint32_t listSize = sizeof(collation_strings_escaped)/sizeof(collation_strings_escaped[0]); |
+ collation_strings = new UnicodeString[listSize]; |
+ for(uint32_t k=0;k<listSize;k++) { |
+ collation_strings[k] = collation_strings_escaped[k].unescape(); |
+ } |
+ UnicodeString shorty((UChar32)0x12345); |
+ } |
+public: |
+ |
+ CollationFunction() |
+ { |
+ num = -1; |
+ |
+ init(); |
+ } |
+ |
+ ~CollationFunction() { |
+ delete [] collation_strings; |
+ } |
+ |
+ CollationFunction(int a, const char* loc) |
+ { |
+ num = a; |
+ strcpy(locale, loc); |
+ init(); |
+ } |
+ |
+ virtual void call(UErrorCode* status2) |
+ { |
+ uint32_t listSize = sizeof(collation_strings_escaped)/sizeof(collation_strings_escaped[0]); |
+ UErrorCode status = U_ZERO_ERROR; |
+ Collator *coll = Collator::createInstance(Locale(locale), status); |
+ |
+ for(int k = 0; k < num; k++) |
+ { |
+ uint32_t i, j; |
+ for(i=listSize-1; i>=1; i--) { |
+ for(j=0; j<i; j++) { |
+ if(coll->compare(collation_strings[j], collation_strings[j+1]) == UCOL_LESS) { |
+ //cout << "Success!" << endl; |
+ } |
+ } |
+ } |
+ } |
+ delete coll; |
+ } |
+ |
+ virtual long getOperationsPerIteration() |
+ { |
+ return num; |
+ } |
+}; |
+ |
+class DateFormatPerfTest : public UPerfTest |
+{ |
+private: |
+ |
+public: |
+ |
+ DateFormatPerfTest(int32_t argc, const char* argv[], UErrorCode& status); |
+ ~DateFormatPerfTest(); |
+ virtual UPerfFunction* runIndexedTest(int32_t index, UBool exec,const char* &name, char* par); |
+ |
+ UPerfFunction* DateFmt250(); |
+ UPerfFunction* DateFmt10000(); |
+ UPerfFunction* DateFmt100000(); |
+ UPerfFunction* BreakItWord250(); |
+ UPerfFunction* BreakItWord10000(); |
+ UPerfFunction* BreakItChar250(); |
+ UPerfFunction* BreakItChar10000(); |
+ UPerfFunction* NumFmt10000(); |
+ UPerfFunction* NumFmt100000(); |
+ UPerfFunction* Collation10000(); |
+ UPerfFunction* Collation100000(); |
+}; |
+ |
+#endif // DateFmtPerf |
Property changes on: icu46/source/test/perf/DateFmtPerf/DateFmtPerf.h |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |