Index: icu46/source/test/perf/ubrkperf/ubrkperf.cpp |
=================================================================== |
--- icu46/source/test/perf/ubrkperf/ubrkperf.cpp (revision 0) |
+++ icu46/source/test/perf/ubrkperf/ubrkperf.cpp (revision 0) |
@@ -0,0 +1,251 @@ |
+/******************************************************************** |
+ * COPYRIGHT: |
+ * Copyright (C) 2001-2008 International Business Machines Corporation |
+ * and others. All Rights Reserved. |
+ * |
+ ********************************************************************/ |
+/******************************************************************************** |
+* |
+* File ubrkperf.cpp |
+* |
+* Modification History: |
+* Name Description |
+* Vladimir Weinstein First Version, based on collperf |
+* |
+********************************************************************************* |
+*/ |
+ |
+#include "ubrkperf.h" |
+#include "uoptions.h" |
+#include <stdio.h> |
+ |
+ |
+#if 0 |
+#ifdef U_DARWIN |
+#include <ApplicationServices/ApplicationServices.h> |
+enum{ |
+ kUCTextBreakAllMask = (kUCTextBreakClusterMask | kUCTextBreakWordMask | kUCTextBreakLineMask) |
+ }; |
+UCTextBreakType breakTypes[4] = {kUCTextBreakCharMask, kUCTextBreakClusterMask, kUCTextBreakWordMask, kUCTextBreakLineMask}; |
+TextBreakLocatorRef breakRef; |
+UCTextBreakType macBreakType; |
+ |
+void createMACBrkIt() { |
+ OSStatus status = noErr; |
+ LocaleRef lref; |
+ status = LocaleRefFromLocaleString(opt_locale, &lref); |
+ status = UCCreateTextBreakLocator(lref, 0, kUCTextBreakAllMask, (TextBreakLocatorRef*)&breakRef); |
+ if(opt_char == TRUE) { |
+ macBreakType = kUCTextBreakClusterMask; |
+ } else if(opt_word == TRUE) { |
+ macBreakType = kUCTextBreakWordMask; |
+ } else if(opt_line == TRUE) { |
+ macBreakType = kUCTextBreakLineMask; |
+ } else if(opt_sentence == TRUE) { |
+ // error |
+ // brkit = BreakIterator::createSentenceInstance(opt_locale, status); |
+ } else { |
+ // default is character iterator |
+ macBreakType = kUCTextBreakClusterMask; |
+ } |
+} |
+#endif |
+ |
+ |
+void doForwardTest() { |
+ if (opt_terse == FALSE) { |
+ printf("Doing the forward test\n"); |
+ } |
+ int32_t noBreaks = 0; |
+ int32_t i = 0; |
+ unsigned long startTime = timeGetTime(); |
+ unsigned long elapsedTime = 0; |
+ if(opt_icu) { |
+ createICUBrkIt(); |
+ brkit->setText(text); |
+ brkit->first(); |
+ if (opt_terse == FALSE) { |
+ printf("Warmup\n"); |
+ } |
+ while(brkit->next() != BreakIterator::DONE) { |
+ noBreaks++; |
+ } |
+ |
+ if (opt_terse == FALSE) { |
+ printf("Measure\n"); |
+ } |
+ startTime = timeGetTime(); |
+ for(i = 0; i < opt_loopCount; i++) { |
+ brkit->first(); |
+ while(brkit->next() != BreakIterator::DONE) { |
+ } |
+ } |
+ |
+ elapsedTime = timeGetTime()-startTime; |
+ } else if(opt_mac) { |
+#ifdef U_DARWIN |
+ createMACBrkIt(); |
+ UniChar* filePtr = text; |
+ OSStatus status = noErr; |
+ UniCharCount startOffset = 0, breakOffset = 0, numUniChars = textSize; |
+ startOffset = 0; |
+ //printf("\t---Search forward--\n"); |
+ |
+ while (startOffset < numUniChars) |
+ { |
+ status = UCFindTextBreak(breakRef, macBreakType, kUCTextBreakLeadingEdgeMask, filePtr, numUniChars, |
+ startOffset, &breakOffset); |
+ //require_action(status == noErr, EXIT, printf( "**UCFindTextBreak failed: startOffset %d, status %d\n", (int)startOffset, (int)status)); |
+ //require_action((breakOffset <= numUniChars),EXIT, printf("**UCFindTextBreak breakOffset too big: startOffset %d, breakOffset %d\n", (int)startOffset, (int)breakOffset)); |
+ |
+ // Output break |
+ //printf("\t%d\n", (int)breakOffset); |
+ |
+ // Increment counters |
+ noBreaks++; |
+ startOffset = breakOffset; |
+ } |
+ startTime = timeGetTime(); |
+ for(i = 0; i < opt_loopCount; i++) { |
+ startOffset = 0; |
+ |
+ while (startOffset < numUniChars) |
+ { |
+ status = UCFindTextBreak(breakRef, macBreakType, kUCTextBreakLeadingEdgeMask, filePtr, numUniChars, |
+ startOffset, &breakOffset); |
+ // Increment counters |
+ startOffset = breakOffset; |
+ } |
+ } |
+ elapsedTime = timeGetTime()-startTime; |
+ UCDisposeTextBreakLocator(&breakRef); |
+#endif |
+ |
+ |
+ } |
+ |
+ |
+ if (opt_terse == FALSE) { |
+ int32_t loopTime = (int)(float(1000) * ((float)elapsedTime/(float)opt_loopCount)); |
+ int32_t timePerCU = (int)(float(1000) * ((float)loopTime/(float)textSize)); |
+ int32_t timePerBreak = (int)(float(1000) * ((float)loopTime/(float)noBreaks)); |
+ printf("forward break iteration average loop time %d\n", loopTime); |
+ printf("number of code units %d average time per code unit %d\n", textSize, timePerCU); |
+ printf("number of breaks %d average time per break %d\n", noBreaks, timePerBreak); |
+ } else { |
+ printf("time=%d\nevents=%d\nsize=%d\n", elapsedTime, noBreaks, textSize); |
+ } |
+ |
+ |
+} |
+ |
+ |
+ |
+ |
+#endif |
+ |
+UPerfFunction* BreakIteratorPerformanceTest::TestICUForward() |
+{ |
+ return new ICUForward(locale, m_mode_, m_file_, m_fileLen_); |
+} |
+ |
+UPerfFunction* BreakIteratorPerformanceTest::TestICUIsBound() |
+{ |
+ return new ICUIsBound(locale, m_mode_, m_file_, m_fileLen_); |
+} |
+ |
+UPerfFunction* BreakIteratorPerformanceTest::TestDarwinForward() |
+{ |
+ return NULL; |
+} |
+ |
+UPerfFunction* BreakIteratorPerformanceTest::TestDarwinIsBound() |
+{ |
+ return NULL; |
+} |
+ |
+UPerfFunction* BreakIteratorPerformanceTest::runIndexedTest(int32_t index, UBool exec, |
+ const char *&name, |
+ char* par) |
+{ |
+ switch (index) { |
+ TESTCASE(0, TestICUForward); |
+ TESTCASE(1, TestICUIsBound); |
+ TESTCASE(2, TestDarwinForward); |
+ TESTCASE(3, TestDarwinIsBound); |
+ default: |
+ name = ""; |
+ return NULL; |
+ } |
+ return NULL; |
+} |
+ |
+UOption options[]={ |
+ UOPTION_DEF( "mode", 'm', UOPT_REQUIRES_ARG) |
+ }; |
+ |
+ |
+BreakIteratorPerformanceTest::BreakIteratorPerformanceTest(int32_t argc, const char* argv[], UErrorCode& status) |
+: UPerfTest(argc,argv,status), |
+m_mode_(NULL), |
+m_file_(NULL), |
+m_fileLen_(0) |
+{ |
+ |
+ _remainingArgc = u_parseArgs(_remainingArgc, (char**)argv, (int32_t)(sizeof(options)/sizeof(options[0])), options); |
+ |
+ |
+ if(options[0].doesOccur) { |
+ m_mode_ = options[0].value; |
+ switch(options[0].value[0]) { |
+ case 'w' : |
+ case 'c' : |
+ case 's' : |
+ case 'l' : |
+ break; |
+ default: |
+ status = U_ILLEGAL_ARGUMENT_ERROR; |
+ break; |
+ } |
+ } else { |
+ status = U_ILLEGAL_ARGUMENT_ERROR; |
+ } |
+ |
+ m_file_ = getBuffer(m_fileLen_, status); |
+ |
+ if(status== U_ILLEGAL_ARGUMENT_ERROR){ |
+ fprintf(stderr, gUsageString, "ubrkperf"); |
+ fprintf(stderr, "\t-m or --mode Required mode for breakiterator: char, word, line or sentence\n"); |
+ |
+ return; |
+ } |
+ |
+ if(U_FAILURE(status)){ |
+ fprintf(stderr, "FAILED to create UPerfTest object. Error: %s\n", u_errorName(status)); |
+ return; |
+ } |
+} |
+ |
+BreakIteratorPerformanceTest::~BreakIteratorPerformanceTest() |
+{ |
+} |
+ |
+ |
+//---------------------------------------------------------------------------------------- |
+// |
+// Main -- process command line, read in and pre-process the test file, |
+// call other functions to do the actual tests. |
+// |
+//---------------------------------------------------------------------------------------- |
+int main(int argc, const char** argv) { |
+ UErrorCode status = U_ZERO_ERROR; |
+ BreakIteratorPerformanceTest test(argc, argv, status); |
+ if(U_FAILURE(status)){ |
+ return status; |
+ } |
+ if(test.run()==FALSE){ |
+ fprintf(stderr,"FAILED: Tests could not be run please check the arguments.\n"); |
+ return -1; |
+ } |
+ return 0; |
+} |
Property changes on: icu46/source/test/perf/ubrkperf/ubrkperf.cpp |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |