You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

258 lines
7.3 KiB

/***********************************************************************
* © 2016 and later: Unicode, Inc. and others.
* License & terms of use: http://www.unicode.org/copyright.html
*
***********************************************************************
***********************************************************************
* COPYRIGHT:
* Copyright (C) 2001-2016 International Business Machines Corporation
* and others. All Rights Reserved.
*
***********************************************************************/
/********************************************************************************
*
* File ubrkperf.cpp
*
* Modification History:
* Name Description
* Vladimir Weinstein First Version, based on collperf
*
*********************************************************************************
*/
#include "cmemory.h"
#include "ubrkperf.h"
#include "uoptions.h"
#include <stdio.h>
#if 0
#if U_PLATFORM_IS_DARWIN_BASED
#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) {
#if U_PLATFORM_IS_DARWIN_BASED
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, UPRV_LENGTHOF(options), 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;
}