X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/51004dcb01e06fef634b61be77ed73dd61cb6db9..refs/heads/master:/icuSources/test/perf/howExpensiveIs/howExpensiveIs.cpp?ds=sidebyside diff --git a/icuSources/test/perf/howExpensiveIs/howExpensiveIs.cpp b/icuSources/test/perf/howExpensiveIs/howExpensiveIs.cpp index 1d15e04a..fb16e4f6 100644 --- a/icuSources/test/perf/howExpensiveIs/howExpensiveIs.cpp +++ b/icuSources/test/perf/howExpensiveIs/howExpensiveIs.cpp @@ -1,18 +1,24 @@ /* - ********************************************************************** - * Copyright (c) 2011-2012,International Business Machines + *********************************************************************** + * © 2016 and later: Unicode, Inc. and others. + * License & terms of use: http://www.unicode.org/copyright.html#License + *********************************************************************** + *********************************************************************** + * Copyright (c) 2011-2016,International Business Machines * Corporation and others. All Rights Reserved. - ********************************************************************** + *********************************************************************** */ #include #include +#include "cmemory.h" #include "sieve.h" #include "unicode/utimer.h" #include "udbgutil.h" #include "unicode/ustring.h" #include "unicode/decimfmt.h" #include "unicode/udat.h" +U_NAMESPACE_USE #if U_PLATFORM_IMPLEMENTS_POSIX #include @@ -28,6 +34,9 @@ void runTests(void); #define ITERATIONS 5 #endif +#ifndef TEST_LOCALE +#define TEST_LOCALE "en_US" +#endif FILE *out = NULL; UErrorCode setupStatus = U_ZERO_ERROR; @@ -62,7 +71,7 @@ int main(int argc, char * const * argv){ #if U_PLATFORM_IMPLEMENTS_POSIX int c; - extern int optind; + //extern int optind; extern char *optarg; while((c=getopt(argc,argv,"lf:t:")) != EOF) { switch(c) { @@ -113,7 +122,7 @@ int main(int argc, char * const * argv){ } else { fprintf(stderr, "# (no output)\n"); } - + if(listmode && testName!=NULL) { fprintf(stderr, "ERR: no -l mode when specific test with -t\n"); usage(progname); @@ -122,7 +131,7 @@ int main(int argc, char * const * argv){ runTests(); - + if(out!=NULL) { #ifndef SKIP_INFO @@ -136,7 +145,7 @@ int main(int argc, char * const * argv){ fprintf(stderr, "Error in tests: %s\n", u_errorName(setupStatus)); return 1; } - + return 0; } @@ -147,10 +156,10 @@ protected: HowExpensiveTest(const char *name, const char *file, int32_t line) : fName(name), fFile(file), fLine(line) {} protected: /** - * @return number of iterations + * @return number of iterations */ virtual int32_t run() = 0; - virtual void warmup() { run(); } + virtual void warmup() { run(); } public: virtual const char *getName() { return fName; } public: @@ -200,7 +209,7 @@ void runTestOn(HowExpensiveTest &t) { double sieveTime = uprv_getSieveTime(NULL); double st; double me; - + fflush(stdout); fflush(stderr); int32_t iter = t.runTests(&st,&me); @@ -210,7 +219,7 @@ void runTestOn(HowExpensiveTest &t) { } fflush(stdout); fflush(stderr); - + double stn = st/sieveTime; printf("%s\t%.9f\t%.9f +/- %.9f, @ %d iter\n", t.getName(),stn,st,me,iter); @@ -272,13 +281,13 @@ public: } protected: virtual UNumberFormat* initFmt() { - return unum_open(UNUM_PATTERN_DECIMAL, fPat.getTerminatedBuffer(), -1, "en_US", 0, &setupStatus); + return unum_open(UNUM_PATTERN_DECIMAL, fPat.getTerminatedBuffer(), -1, TEST_LOCALE, 0, &setupStatus); } virtual const char *getClassName() { return "NumTest"; } public: - NumTest(const char *pat, const char *num, double expect, const char *FILE, int LINE) + NumTest(const char *pat, const char *num, double expect, const char *FILE, int LINE) : HowExpensiveTest("(n/a)",FILE, LINE), fExpect(expect), fFmt(0), @@ -299,7 +308,7 @@ public: double trial = unum_parseDouble(fFmt,fStr,fLen, NULL, &setupStatus); if(U_SUCCESS(setupStatus) && trial!=fExpect) { setupStatus = U_INTERNAL_PROGRAM_ERROR; - printf("%s:%d: warmup() %s got %.8f expected %.8f\n", + printf("%s:%d: warmup() %s got %.8f expected %.8f\n", fFile,fLine,getName(),trial,fExpect); } } @@ -318,7 +327,7 @@ public: #define DO_NumTest(p,n,x) { NumTest t(p,n,x,__FILE__,__LINE__); runTestOn(t); } -class AttrNumTest : public NumTest +class AttrNumTest : public NumTest { private: UNumberFormatAttribute fAttr; @@ -330,7 +339,7 @@ protected: return name2; } public: - AttrNumTest(const char *pat, const char *num, double expect, const char *FILE, int LINE, UNumberFormatAttribute attr, int32_t newValue) + AttrNumTest(const char *pat, const char *num, double expect, const char *FILE, int LINE, UNumberFormatAttribute attr, int32_t newValue) : NumTest(pat,num,expect,FILE,LINE), fAttr(attr), fAttrValue(newValue) @@ -346,7 +355,7 @@ public: #define DO_AttrNumTest(p,n,x,a,v) { AttrNumTest t(p,n,x,__FILE__,__LINE__,a,v); runTestOn(t); } -class NOXNumTest : public NumTest +class NOXNumTest : public NumTest { private: UNumberFormatAttribute fAttr; @@ -358,7 +367,7 @@ protected: return name2; } public: - NOXNumTest(const char *pat, const char *num, double expect, const char *FILE, int LINE /*, UNumberFormatAttribute attr, int32_t newValue */) + NOXNumTest(const char *pat, const char *num, double expect, const char *FILE, int LINE /*, UNumberFormatAttribute attr, int32_t newValue */) : NumTest(pat,num,expect,FILE,LINE) /* , fAttr(attr), fAttrValue(newValue) */ @@ -400,13 +409,13 @@ public: } protected: virtual UNumberFormat* initFmt() { - return unum_open(UNUM_PATTERN_DECIMAL, fPat.getTerminatedBuffer(), -1, "en_US", 0, &setupStatus); + return unum_open(UNUM_PATTERN_DECIMAL, fPat.getTerminatedBuffer(), -1, TEST_LOCALE, 0, &setupStatus); } virtual const char *getClassName() { return "NumFmtTest"; } public: - NumFmtTest(const char *pat, const char *num, double expect, const char *FILE, int LINE) + NumFmtTest(const char *pat, const char *num, double expect, const char *FILE, int LINE) : HowExpensiveTest("(n/a)",FILE, LINE), fExpect(expect), fFmt(0), @@ -426,13 +435,13 @@ public: UChar buf[100]; if(U_SUCCESS(setupStatus)) { int32_t trial = unum_formatDouble(fFmt,fExpect, buf, 100, NULL, &setupStatus); - if(!U_SUCCESS(setupStatus) + if(!U_SUCCESS(setupStatus) || trial!=fLen ||trial<=0 || u_strncmp(fStr,buf,trial) ) { char strBuf[200]; u_strToUTF8(strBuf,200,NULL,buf,trial+1,&setupStatus); - printf("%s:%d: warmup() %s got %s expected %s, err %s\n", + printf("%s:%d: warmup() %s got %s expected %s, err %s\n", fFile,fLine,getName(),strBuf,fCStr, u_errorName(setupStatus)); setupStatus = U_INTERNAL_PROGRAM_ERROR; } @@ -454,9 +463,17 @@ public: #define DO_NumFmtTest(p,n,x) { NumFmtTest t(p,n,x,__FILE__,__LINE__); runTestOn(t); } - class NumFmtInt64Test : public HowExpensiveTest { +public: + enum EMode { + kDefault, + kPattern, + kApplyPattern, + kGroupOff, + kApplyGroupOff + }; private: + EMode fMode; int64_t fExpect; UNumberFormat *fFmt; UnicodeString fPat; @@ -477,14 +494,53 @@ public: } protected: virtual UNumberFormat* initFmt() { - return unum_open(UNUM_PATTERN_DECIMAL, fPat.getTerminatedBuffer(), -1, "en_US", 0, &setupStatus); + switch(fMode) { + case kPattern: + return unum_open(UNUM_PATTERN_DECIMAL, fPat.getTerminatedBuffer(), -1, TEST_LOCALE, 0, &setupStatus); + case kApplyPattern: + { + UNumberFormat *fmt = unum_open(UNUM_DECIMAL, NULL, -1, TEST_LOCALE, 0, &setupStatus); + unum_applyPattern(fmt, FALSE, fPat.getTerminatedBuffer(), -1, NULL, &setupStatus); + return fmt; + } + case kGroupOff: + { + UNumberFormat *fmt = unum_open(UNUM_PATTERN_DECIMAL, fPat.getTerminatedBuffer(), -1, TEST_LOCALE, 0, &setupStatus); + unum_setAttribute(fmt, UNUM_GROUPING_USED, UNUM_NO); + return fmt; + } + case kApplyGroupOff: + { + UNumberFormat *fmt = unum_open(UNUM_DECIMAL, NULL, -1, TEST_LOCALE, 0, &setupStatus); + unum_applyPattern(fmt, FALSE, fPat.getTerminatedBuffer(), -1, NULL, &setupStatus); + unum_setAttribute(fmt, UNUM_GROUPING_USED, UNUM_NO); + return fmt; + } + default: + case kDefault: + return unum_open(UNUM_DEFAULT, NULL, -1, TEST_LOCALE, 0, &setupStatus); + } } virtual const char *getClassName() { - return "NumFmtInt64Test"; + switch(fMode) { + case EMode::kDefault: + return "NumFmtInt64Test (default)"; + case EMode::kPattern: + return "NumFmtInt64Test (pattern)"; + case EMode::kApplyPattern: + return "NumFmtInt64Test (applypattern)"; + case EMode::kGroupOff: + return "NumFmtInt64Test (pattern, group=off)"; + case EMode::kApplyGroupOff: + return "NumFmtInt64Test (applypattern, group=off)"; + default: + return "NumFmtInt64Test (? ? ?)"; + } } public: - NumFmtInt64Test(const char *pat, const char *num, int64_t expect, const char *FILE, int LINE) + NumFmtInt64Test(const char *pat, const char *num, int64_t expect, const char *FILE, int LINE, EMode mode) : HowExpensiveTest("(n/a)",FILE, LINE), + fMode(mode), fExpect(expect), fFmt(0), fPat(pat, -1, US_INV), @@ -503,13 +559,13 @@ public: UChar buf[100]; if(U_SUCCESS(setupStatus)) { int32_t trial = unum_formatInt64(fFmt,fExpect, buf, 100, NULL, &setupStatus); - if(!U_SUCCESS(setupStatus) + if(!U_SUCCESS(setupStatus) || trial!=fLen ||trial<=0 || u_strncmp(fStr,buf,trial) ) { char strBuf[200]; u_strToUTF8(strBuf,200,NULL,buf,trial+1,&setupStatus); - printf("%s:%d: warmup() %s got %s (len %d) expected %s (len %d), err %s\n", + printf("%s:%d: warmup() %s got %s (len %d) expected %s (len %d), err %s\n", fFile,fLine,getName(),strBuf,trial,fCStr,fLen, u_errorName(setupStatus)); setupStatus = U_INTERNAL_PROGRAM_ERROR; } @@ -529,7 +585,18 @@ public: virtual ~NumFmtInt64Test(){} }; -#define DO_NumFmtInt64Test(p,n,x) { NumFmtInt64Test t(p,n,x,__FILE__,__LINE__); runTestOn(t); } +/** + * unum_open .. with pattern, == new DecimalFormat(pattern) + */ +#define DO_NumFmtInt64Test(p,n,x) { NumFmtInt64Test t(p,n,x,__FILE__,__LINE__,NumFmtInt64Test::EMode::kPattern); runTestOn(t); } +/** + * unum_open(UNUM_DECIMAL), then + */ +#define DO_NumFmtInt64Test_apply(p,n,x) { NumFmtInt64Test t(p,n,x,__FILE__,__LINE__,NumFmtInt64Test::EMode::kApplyPattern); runTestOn(t); } + +#define DO_NumFmtInt64Test_default(p,n,x) { NumFmtInt64Test t(p,n,x,__FILE__,__LINE__,NumFmtInt64Test::EMode::kDefault); runTestOn(t); } +#define DO_NumFmtInt64Test_gr0(p,n,x) { NumFmtInt64Test t(p,n,x,__FILE__,__LINE__,NumFmtInt64Test::EMode::kGroupOff); runTestOn(t); } +#define DO_NumFmtInt64Test_applygr0(p,n,x) { NumFmtInt64Test t(p,n,x,__FILE__,__LINE__,NumFmtInt64Test::EMode::kApplyGroupOff); runTestOn(t); } class NumFmtStringPieceTest : public HowExpensiveTest { @@ -563,7 +630,7 @@ protected: return "NumFmtStringPieceTest"; } public: - NumFmtStringPieceTest(const char *pat, const char *num, const StringPiece& expect, const char *FILE, int LINE) + NumFmtStringPieceTest(const char *pat, const char *num, const StringPiece& expect, const char *FILE, int LINE) : HowExpensiveTest("(n/a)",FILE, LINE), fExpect(expect), fFmt(0), @@ -584,20 +651,22 @@ public: if(U_SUCCESS(setupStatus)) { buf.remove(); ((const DecimalFormat*)fFmt)->format(fExpect, buf, NULL, setupStatus); - if(!U_SUCCESS(setupStatus) + if(!U_SUCCESS(setupStatus) || fString!=buf ) { char strBuf[200]; u_strToUTF8(strBuf,200,NULL,buf.getTerminatedBuffer(),buf.length()+1,&setupStatus); - printf("%s:%d: warmup() %s got %s (len %d) expected %s (len %d), err %s\n", + printf("%s:%d: warmup() %s got %s (len %d) expected %s (len %d), err %s\n", fFile,fLine,getName(),strBuf,buf.length(),fCStr,fLen, u_errorName(setupStatus)); setupStatus = U_INTERNAL_PROGRAM_ERROR; } } } - + int32_t run() { +#if U_DEBUG int32_t trial; +#endif int i=0; UnicodeString buf; if(U_SUCCESS(setupStatus)) { @@ -623,20 +692,20 @@ static UChar strbeng[] = {0x09E8,0x09E8,0x09E8,0x09E8, 0 }; UNumberFormat *NumParseTest_fmt; // TODO: de-uglify. -QuickTest(NumParseTest,{ static UChar pattern[] = { 0x23 }; NumParseTest_fmt = unum_open(UNUM_PATTERN_DECIMAL, pattern, 1, "en_US", 0, &setupStatus); },{ int32_t i; static UChar str[] = { 0x31 };double val; for(i=0;i