| Index: icu46/source/test/perf/ustrperf/stringperf.h
|
| ===================================================================
|
| --- icu46/source/test/perf/ustrperf/stringperf.h (revision 0)
|
| +++ icu46/source/test/perf/ustrperf/stringperf.h (revision 0)
|
| @@ -0,0 +1,549 @@
|
| +/*
|
| +**********************************************************************
|
| +* Copyright (c) 2002-2006, International Business Machines
|
| +* Corporation and others. All Rights Reserved.
|
| +**********************************************************************
|
| +*/
|
| +#ifndef _STRINGPERF_H
|
| +#define _STRINGPERF_H
|
| +
|
| +#include <string>
|
| +
|
| +#include "unicode/utypes.h"
|
| +#include "unicode/unistr.h"
|
| +
|
| +#include "unicode/uperf.h"
|
| +
|
| +typedef std::wstring stlstring;
|
| +
|
| +/* Define all constants for test case operations */
|
| +#define MAXNUMLINES 40000 //Max number of lines in a test data file
|
| +#define MAXSRCLEN 20 //Max length of one line. maybe a larger number, but it need more mem
|
| +#define LOOPS 100 //Iterations
|
| +//#define LOOPS 10
|
| +#define catenate_STRLEN 2
|
| +
|
| +const UChar uTESTCHAR1 = 'a';
|
| +const wchar_t wTESTCHAR1 = 'a';
|
| +const UnicodeString uEMPTY;
|
| +const stlstring sEMPTY;
|
| +UnicodeString unistr;
|
| +stlstring stlstr;
|
| +// Simulate construction with a single-char string for basic_string
|
| +wchar_t simulate[2]={wTESTCHAR1, 0};
|
| +
|
| +/* Constants for scan operation */
|
| +U_STRING_DECL(scan_STRING, "Dot. 123. Some more data.", 25);
|
| +const UnicodeString uScan_STRING=UnicodeString(scan_STRING);
|
| +const stlstring sScan_STRING=stlstring(L"Dot. 123. Some more data.");
|
| +
|
| +/* global variables or constants for concatenation operation */
|
| +U_STRING_DECL(uCatenate_STR, "!!", 2);
|
| +const stlstring sCatenate_STR=stlstring(L"!!");
|
| +static UnicodeString* catICU;
|
| +static stlstring* catStd;
|
| +UBool bCatenatePrealloc;
|
| +
|
| +/* type defines */
|
| +typedef struct WLine WLine;
|
| +struct WLine {
|
| + wchar_t name[100];
|
| + int32_t len;
|
| +}; //struct to store one line of wchar_t string
|
| +
|
| +enum FnType { Fn_ICU, Fn_STD };
|
| +typedef FnType FnType;
|
| +typedef void (*ICUStringPerfFn)(const UChar* src,int32_t srcLen, UnicodeString s0);
|
| +typedef void (*StdStringPerfFn)(const wchar_t* src,int32_t srcLen, stlstring s0);
|
| +
|
| +
|
| +class StringPerfFunction : public UPerfFunction
|
| +{
|
| +public:
|
| +
|
| + virtual long getEventsPerIteration(){
|
| + int loops = LOOPS;
|
| + if (catICU) { delete catICU;}
|
| + if (catStd) { delete catStd;}
|
| +
|
| + if (bCatenatePrealloc) {
|
| +
|
| + int to_alloc = loops * MAXNUMLINES * (MAXSRCLEN + catenate_STRLEN);
|
| + catICU = new UnicodeString(to_alloc,'a',0);
|
| + //catICU = new UnicodeString();
|
| +
|
| + catStd = new stlstring();
|
| + //catStd -> reserve(loops * MAXNUMLINES * (MAXSRCLEN + catenate_STRLEN));
|
| + catStd -> reserve(110000000);
|
| + } else {
|
| + catICU = new UnicodeString();
|
| + catStd = new stlstring();
|
| + }
|
| +
|
| + return -1;
|
| + }
|
| +
|
| + virtual void call(UErrorCode* status)
|
| + {
|
| + if(line_mode_==TRUE){
|
| + if(uselen_){
|
| + for(int32_t i = 0; i< numLines_; i++){
|
| + if (fnType_==Fn_ICU) {
|
| + (*fn1_)(lines_[i].name,lines_[i].len,uS0_[i]);
|
| + } else {
|
| + (*fn2_)(wlines_[i].name,wlines_[i].len,sS0_[i]);
|
| + }
|
| + }
|
| + }else{
|
| + for(int32_t i = 0; i< numLines_; i++){
|
| + if (fnType_==Fn_ICU) {
|
| + (*fn1_)(lines_[i].name,-1,uS0_[i]);
|
| + } else {
|
| + (*fn2_)(wlines_[i].name,-1,sS0_[i]);
|
| + }
|
| + }
|
| + }
|
| + }else{
|
| + if(uselen_){
|
| + if (fnType_==Fn_ICU) {
|
| + (*fn1_)(src_,srcLen_,*ubulk_);
|
| + } else {
|
| + (*fn2_)(wsrc_,wsrcLen_,*sbulk_);
|
| + }
|
| + }else{
|
| + if (fnType_==Fn_ICU) {
|
| + (*fn1_)(src_,-1,*ubulk_);
|
| + } else {
|
| + (*fn2_)(wsrc_,-1,*sbulk_);
|
| + }
|
| + }
|
| + }
|
| + }
|
| +
|
| + virtual long getOperationsPerIteration()
|
| + {
|
| + if(line_mode_==TRUE){
|
| + return numLines_;
|
| + }else{
|
| + return 1;
|
| + }
|
| + }
|
| +
|
| + StringPerfFunction(ICUStringPerfFn func, ULine* srcLines, int32_t srcNumLines, UBool uselen)
|
| + {
|
| +
|
| + fn1_ = func;
|
| + lines_=srcLines;
|
| + wlines_=NULL;
|
| + numLines_=srcNumLines;
|
| + uselen_=uselen;
|
| + line_mode_=TRUE;
|
| + src_ = NULL;
|
| + srcLen_ = 0;
|
| + wsrc_ = NULL;
|
| + wsrcLen_ = 0;
|
| + fnType_ = Fn_ICU;
|
| +
|
| + uS0_=new UnicodeString[numLines_];
|
| + for(int32_t i=0; i<numLines_; i++) {
|
| + uS0_[i]=UnicodeString(lines_[i].name, lines_[i].len);
|
| + }
|
| + sS0_=NULL;
|
| + ubulk_=NULL;
|
| + sbulk_=NULL;
|
| + }
|
| +
|
| + StringPerfFunction(StdStringPerfFn func, ULine* srcLines, int32_t srcNumLines, UBool uselen)
|
| + {
|
| +
|
| + fn2_ = func;
|
| + lines_=srcLines;
|
| + wlines_=NULL;
|
| + numLines_=srcNumLines;
|
| + uselen_=uselen;
|
| + line_mode_=TRUE;
|
| + src_ = NULL;
|
| + srcLen_ = 0;
|
| + wsrc_ = NULL;
|
| + wsrcLen_ = 0;
|
| + fnType_ = Fn_STD;
|
| +
|
| + uS0_=NULL;
|
| + ubulk_=NULL;
|
| + sbulk_=NULL;
|
| +
|
| + //fillin wlines_[], sS0_[]
|
| + prepareLinesForStd();
|
| + }
|
| +
|
| + StringPerfFunction(ICUStringPerfFn func, UChar* source, int32_t sourceLen, UBool uselen)
|
| + {
|
| +
|
| + fn1_ = func;
|
| + lines_=NULL;
|
| + wlines_=NULL;
|
| + numLines_=0;
|
| + uselen_=uselen;
|
| + line_mode_=FALSE;
|
| + src_ = new UChar[sourceLen];
|
| + memcpy(src_, source, sourceLen * U_SIZEOF_UCHAR);
|
| + srcLen_ = sourceLen;
|
| + wsrc_ = NULL;
|
| + wsrcLen_ = 0;
|
| + fnType_ = Fn_ICU;
|
| +
|
| + uS0_=NULL;
|
| + sS0_=NULL;
|
| + ubulk_=new UnicodeString(src_,srcLen_);
|
| + sbulk_=NULL;
|
| + }
|
| +
|
| + StringPerfFunction(StdStringPerfFn func, UChar* source, int32_t sourceLen, UBool uselen)
|
| + {
|
| +
|
| + fn2_ = func;
|
| + lines_=NULL;
|
| + wlines_=NULL;
|
| + numLines_=0;
|
| + uselen_=uselen;
|
| + line_mode_=FALSE;
|
| + src_ = new UChar[sourceLen];
|
| + memcpy(src_, source, sourceLen * U_SIZEOF_UCHAR);
|
| + srcLen_ = sourceLen;
|
| + fnType_ = Fn_STD;
|
| +
|
| + uS0_=NULL;
|
| + sS0_=NULL;
|
| + ubulk_=NULL;
|
| +
|
| + //fillin wsrc_, sbulk_
|
| + prepareBulkForStd();
|
| +
|
| + }
|
| +
|
| + ~StringPerfFunction()
|
| + {
|
| + //free(src_);
|
| + free(wsrc_);
|
| + delete[] src_;
|
| + delete ubulk_;
|
| + delete sbulk_;
|
| + delete[] uS0_;
|
| + delete[] sS0_;
|
| + delete[] wlines_;
|
| + }
|
| +
|
| +private:
|
| + void prepareLinesForStd(void)
|
| + {
|
| + UErrorCode err=U_ZERO_ERROR;
|
| +
|
| + wlines_=new WLine[numLines_];
|
| + wchar_t ws[100];
|
| + int32_t wcap = sizeof(ws) / sizeof(*ws);
|
| + int32_t wl;
|
| + wchar_t* wcs;
|
| +
|
| + sS0_=new stlstring[numLines_];
|
| + for(int32_t i=0; i<numLines_; i++) {
|
| + if(uselen_) {
|
| + wcs = u_strToWCS(ws, wcap, &wl, lines_[i].name, lines_[i].len, &err);
|
| + memcpy(wlines_[i].name, wcs, wl * sizeof(wchar_t));
|
| + wlines_[i].len = wl;
|
| + sS0_[i]=stlstring(wlines_[i].name, wlines_[i].len);
|
| + } else {
|
| + wcs = u_strToWCS(ws, wcap, &wl, lines_[i].name, lines_[i].len-1, &err);
|
| + memcpy(wlines_[i].name, wcs, wl*sizeof(wchar_t));
|
| + wlines_[i].len = wl;
|
| + sS0_[i]=stlstring(wlines_[i].name, wlines_[i].len+1);
|
| + }
|
| +
|
| + if (U_FAILURE(err)) {
|
| + return;
|
| + }
|
| + }
|
| +
|
| + }
|
| +
|
| + void prepareBulkForStd(void)
|
| + {
|
| + UErrorCode err=U_ZERO_ERROR;
|
| +
|
| + const UChar* uSrc = src_;
|
| + int32_t uSrcLen = srcLen_;
|
| + wchar_t* wDest = NULL;
|
| + int32_t wDestLen = 0;
|
| + int32_t reqLen= 0 ;
|
| +
|
| + if(uselen_) {
|
| + /* pre-flight*/
|
| + u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen,&err);
|
| +
|
| + if(err == U_BUFFER_OVERFLOW_ERROR){
|
| + err=U_ZERO_ERROR;
|
| + wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen));
|
| + wDestLen = reqLen;
|
| + u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen,&err);
|
| + }
|
| +
|
| + if (U_SUCCESS(err)) {
|
| + wsrc_ = wDest;
|
| + wsrcLen_ = wDestLen;
|
| + sbulk_=new stlstring(wsrc_,wsrcLen_);
|
| + }
|
| +
|
| + } else {
|
| + /* pre-flight*/
|
| + u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err);
|
| +
|
| + if(err == U_BUFFER_OVERFLOW_ERROR){
|
| + err=U_ZERO_ERROR;
|
| + wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1));
|
| + wDestLen = reqLen+1;
|
| + u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err);
|
| + }
|
| +
|
| + if (U_SUCCESS(err)) {
|
| + wsrc_ = wDest;
|
| + wsrcLen_ = wDestLen;
|
| + sbulk_=new stlstring(wsrc_);
|
| + }
|
| + }
|
| +
|
| + //free(wDest);
|
| + }
|
| +
|
| +
|
| +private:
|
| + ICUStringPerfFn fn1_;
|
| + StdStringPerfFn fn2_;
|
| +
|
| + ULine* lines_;
|
| + WLine* wlines_;
|
| + int32_t numLines_;
|
| +
|
| + UBool uselen_;
|
| + UChar* src_;
|
| + int32_t srcLen_;
|
| + wchar_t* wsrc_;
|
| + int32_t wsrcLen_;
|
| + UBool line_mode_;
|
| +
|
| + //added for preparing testing data
|
| + UnicodeString* uS0_;
|
| + stlstring* sS0_;
|
| + UnicodeString* ubulk_;
|
| + stlstring* sbulk_;
|
| + FnType fnType_;
|
| +};
|
| +
|
| +
|
| +class StringPerformanceTest : public UPerfTest
|
| +{
|
| +public:
|
| + StringPerformanceTest(int32_t argc, const char *argv[], UErrorCode &status);
|
| + ~StringPerformanceTest();
|
| + virtual UPerfFunction* runIndexedTest(int32_t index, UBool exec,
|
| + const char *&name,
|
| + char *par = NULL);
|
| + UPerfFunction* TestCtor();
|
| + UPerfFunction* TestCtor1();
|
| + UPerfFunction* TestCtor2();
|
| + UPerfFunction* TestCtor3();
|
| + UPerfFunction* TestAssign();
|
| + UPerfFunction* TestAssign1();
|
| + UPerfFunction* TestAssign2();
|
| + UPerfFunction* TestGetch();
|
| + UPerfFunction* TestCatenate();
|
| + UPerfFunction* TestScan();
|
| + UPerfFunction* TestScan1();
|
| + UPerfFunction* TestScan2();
|
| +
|
| + UPerfFunction* TestStdLibCtor();
|
| + UPerfFunction* TestStdLibCtor1();
|
| + UPerfFunction* TestStdLibCtor2();
|
| + UPerfFunction* TestStdLibCtor3();
|
| + UPerfFunction* TestStdLibAssign();
|
| + UPerfFunction* TestStdLibAssign1();
|
| + UPerfFunction* TestStdLibAssign2();
|
| + UPerfFunction* TestStdLibGetch();
|
| + UPerfFunction* TestStdLibCatenate();
|
| + UPerfFunction* TestStdLibScan();
|
| + UPerfFunction* TestStdLibScan1();
|
| + UPerfFunction* TestStdLibScan2();
|
| +
|
| +private:
|
| + long COUNT_;
|
| + ULine* filelines_;
|
| + UChar* StrBuffer;
|
| + int32_t StrBufferLen;
|
| +
|
| +};
|
| +
|
| +
|
| +inline void ctor(const UChar* src,int32_t srcLen, UnicodeString s0)
|
| +{
|
| + UnicodeString a;
|
| +}
|
| +
|
| +inline void ctor1(const UChar* src,int32_t srcLen, UnicodeString s0)
|
| +{
|
| + UnicodeString b(uTESTCHAR1);
|
| +}
|
| +
|
| +inline void ctor2(const UChar* src,int32_t srcLen, UnicodeString s0)
|
| +{
|
| + UnicodeString c(uEMPTY);
|
| +}
|
| +
|
| +inline void ctor3(const UChar* src,int32_t srcLen, UnicodeString s0)
|
| +{
|
| + UnicodeString d(src,srcLen);
|
| +}
|
| +
|
| +inline UnicodeString icu_assign_helper(const UChar* src,int32_t srcLen)
|
| +{
|
| + if (srcLen==-1) { return src;}
|
| + else { return UnicodeString(src, srcLen);}
|
| +}
|
| +
|
| +inline void assign(const UChar* src,int32_t srcLen, UnicodeString s0)
|
| +{
|
| + unistr = icu_assign_helper(src,srcLen);
|
| +}
|
| +
|
| +inline void assign1(const UChar* src,int32_t srcLen, UnicodeString s0)
|
| +{
|
| + unistr.setTo(src, srcLen);
|
| +}
|
| +
|
| +inline void assign2(const UChar* src,int32_t srcLen, UnicodeString s0)
|
| +{
|
| + unistr = s0;
|
| +}
|
| +
|
| +inline void getch(const UChar* src,int32_t srcLen, UnicodeString s0)
|
| +{
|
| + s0.charAt(0);
|
| +}
|
| +
|
| +
|
| +inline void catenate(const UChar* src,int32_t srcLen, UnicodeString s0)
|
| +{
|
| + UTimer mystart, mystop;
|
| + utimer_getTime(&mystart);
|
| +
|
| + *catICU += s0;
|
| +
|
| + utimer_getTime(&mystop);
|
| + double mytime = utimer_getDeltaSeconds(&mystart,&mystop);
|
| + printf("\nmytime=%f \n", mytime);
|
| +
|
| + *catICU += uCatenate_STR;
|
| +}
|
| +
|
| +volatile int scan_idx;
|
| +U_STRING_DECL(SCAN1, "123", 3);
|
| +
|
| +inline void scan(const UChar* src,int32_t srcLen, UnicodeString s0)
|
| +{
|
| + UChar c='.';
|
| + scan_idx = uScan_STRING.indexOf(c);
|
| +}
|
| +
|
| +inline void scan1(const UChar* src,int32_t srcLen, UnicodeString s0)
|
| +{
|
| + scan_idx = uScan_STRING.indexOf(SCAN1,3);
|
| +}
|
| +
|
| +inline void scan2(const UChar* src,int32_t srcLen, UnicodeString s0)
|
| +{
|
| + UChar c1='s';
|
| + UChar c2='m';
|
| + scan_idx = uScan_STRING.indexOf(c1);
|
| + scan_idx = uScan_STRING.indexOf(c2);
|
| +}
|
| +
|
| +
|
| +inline void StdLibCtor(const wchar_t* src,int32_t srcLen, stlstring s0)
|
| +{
|
| + stlstring a;
|
| +}
|
| +
|
| +inline void StdLibCtor1(const wchar_t* src,int32_t srcLen, stlstring s0)
|
| +{
|
| + stlstring b(simulate);
|
| +}
|
| +
|
| +inline void StdLibCtor2(const wchar_t* src,int32_t srcLen, stlstring s0)
|
| +{
|
| + stlstring c(sEMPTY);
|
| +}
|
| +
|
| +inline void StdLibCtor3(const wchar_t* src,int32_t srcLen, stlstring s0)
|
| +{
|
| + if (srcLen==-1) {
|
| + stlstring d(src);
|
| + }else {
|
| + stlstring d(src, srcLen);
|
| + }
|
| +}
|
| +
|
| +inline stlstring stl_assign_helper(const wchar_t* src,int32_t srcLen)
|
| +{
|
| + if (srcLen==-1) { return src;}
|
| + else { return stlstring(src, srcLen);}
|
| +}
|
| +
|
| +inline void StdLibAssign(const wchar_t* src,int32_t srcLen, stlstring s0)
|
| +{
|
| + stlstr = stl_assign_helper(src,srcLen);
|
| +}
|
| +
|
| +inline void StdLibAssign1(const wchar_t* src,int32_t srcLen, stlstring s0)
|
| +{
|
| + if (srcLen==-1) { stlstr=src;}
|
| + else { stlstr.assign(src, srcLen);}
|
| +}
|
| +
|
| +inline void StdLibAssign2(const wchar_t* src,int32_t srcLen, stlstring s0)
|
| +{
|
| + stlstr=s0;
|
| +}
|
| +
|
| +inline void StdLibGetch(const wchar_t* src,int32_t srcLen, stlstring s0)
|
| +{
|
| + s0.at(0);
|
| +}
|
| +
|
| +inline void StdLibCatenate(const wchar_t* src,int32_t srcLen, stlstring s0)
|
| +{
|
| + UTimer mystart, mystop;
|
| + utimer_getTime(&mystart);
|
| +
|
| + *catStd += s0;
|
| + *catStd += sCatenate_STR;
|
| +
|
| + utimer_getTime(&mystop);
|
| + double mytime = utimer_getDeltaSeconds(&mystart,&mystop);
|
| + printf("\nmytime=%f \n", mytime);
|
| +
|
| +}
|
| +
|
| +inline void StdLibScan(const wchar_t* src,int32_t srcLen, stlstring s0)
|
| +{
|
| + scan_idx = (int) sScan_STRING.find('.');
|
| +}
|
| +
|
| +inline void StdLibScan1(const wchar_t* src,int32_t srcLen, stlstring s0)
|
| +{
|
| + scan_idx = (int) sScan_STRING.find(L"123");
|
| +}
|
| +
|
| +inline void StdLibScan2(const wchar_t* src,int32_t srcLen, stlstring s0)
|
| +{
|
| + scan_idx = (int) sScan_STRING.find_first_of(L"sm");
|
| +}
|
| +
|
| +#endif // STRINGPERF_H
|
| +
|
|
|
| Property changes on: icu46/source/test/perf/ustrperf/stringperf.h
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|