1 /*********************************************************************** 2 * Copyright (C) 2016 and later: Unicode, Inc. and others. 3 * License & terms of use: http://www.unicode.org/copyright.html#License 4 * 5 *********************************************************************** 6 *********************************************************************** 7 * COPYRIGHT: 8 * Copyright (C) 2002-2006 International Business Machines Corporation 9 * and others. All Rights Reserved. 10 * 11 ***********************************************************************/ 12 /***************************************************************************** 13 * File stringperf.cpp 14 * 15 * Modification History: 16 * Name Description 17 * Doug Wang Second version 18 * Doug Wang First Version 19 ****************************************************************************** 20 */ 21 22 /** 23 * This program tests UnicodeString performance. 24 * APIs tested: UnicodeString 25 * ICU4C 26 * Windows 2000/XP, Linux 27 */ 28 29 #include "stringperf.h" 30 31 main(int argc,const char * argv[])32 int main(int argc, const char *argv[]) 33 { 34 UErrorCode status = U_ZERO_ERROR; 35 36 bCatenatePrealloc=TRUE; 37 38 StringPerformanceTest test(argc, argv, status); 39 if (U_FAILURE(status)){ 40 return status; 41 } 42 43 int loops = LOOPS; 44 if (bCatenatePrealloc) { 45 int to_alloc = loops * MAXNUMLINES * (MAXSRCLEN + catenate_STRLEN); 46 catICU = new UnicodeString(to_alloc,'a',0); 47 //catICU = new UnicodeString(); 48 49 catStd = new stlstring(); 50 catStd -> reserve(loops * MAXNUMLINES * (MAXSRCLEN + catenate_STRLEN)); 51 //catStd -> reserve(110000000); 52 } else { 53 catICU = new UnicodeString(); 54 catStd = new stlstring(); 55 } 56 57 if (test.run() == FALSE){ 58 fprintf(stderr, "FAILED: Tests could not be run please check the " 59 "arguments.\n"); 60 return -1; 61 } 62 63 delete catICU; 64 delete catStd; 65 return 0; 66 } 67 StringPerformanceTest(int32_t argc,const char * argv[],UErrorCode & status)68 StringPerformanceTest::StringPerformanceTest(int32_t argc, const char *argv[], 69 UErrorCode &status) 70 : UPerfTest(argc, argv, status) 71 { 72 filelines_=NULL; 73 StrBuffer=NULL; 74 StrBufferLen=0; 75 76 int32_t len =0; 77 78 if (status== U_ILLEGAL_ARGUMENT_ERROR){ 79 //fprintf(stderr,gUsageString, "stringperf"); 80 return; 81 } 82 if (U_FAILURE(status)){ 83 fprintf(stderr, "FAILED to create UPerfTest object. Error: %s\n", 84 u_errorName(status)); 85 return; 86 } 87 88 89 if(line_mode){ 90 ULine* filelines = getLines(status); 91 if(U_FAILURE(status)){ 92 fprintf(stderr, "FAILED to read lines from file and create UPerfTest object. Error: %s\n", u_errorName(status)); 93 return; 94 } 95 96 filelines_ = new ULine[numLines]; 97 for (int i =0; i < numLines; i++) { 98 len = filelines[i].len; 99 filelines_[i].name = new UChar[len]; 100 filelines_[i].len = len; 101 memcpy(filelines_[i].name, filelines[i].name, len * U_SIZEOF_UCHAR); 102 } 103 104 }else if(bulk_mode){ 105 int32_t srcLen = 0; 106 const UChar* src = getBuffer(srcLen,status); 107 if(U_FAILURE(status)){ 108 fprintf(stderr, "FAILED to read buffer from file and create UPerfTest object. Error: %s\n", u_errorName(status)); 109 return; 110 } 111 112 StrBuffer = new UChar[srcLen]; 113 StrBufferLen = srcLen; 114 memcpy(StrBuffer, src, srcLen * U_SIZEOF_UCHAR); 115 116 } 117 } 118 ~StringPerformanceTest()119 StringPerformanceTest::~StringPerformanceTest() 120 { 121 delete[] filelines_; 122 delete[] StrBuffer; 123 } 124 runIndexedTest(int32_t index,UBool exec,const char * & name,char * par)125 UPerfFunction* StringPerformanceTest::runIndexedTest(int32_t index, UBool exec, 126 const char *&name, 127 char* par) 128 { 129 switch (index) { 130 TESTCASE(0, TestCtor); 131 TESTCASE(1, TestCtor1); 132 TESTCASE(2, TestCtor2); 133 TESTCASE(3, TestCtor3); 134 TESTCASE(4, TestAssign); 135 TESTCASE(5, TestAssign1); 136 TESTCASE(6, TestAssign2); 137 TESTCASE(7, TestGetch); 138 TESTCASE(8, TestCatenate); 139 TESTCASE(9, TestScan); 140 TESTCASE(10, TestScan1); 141 TESTCASE(11, TestScan2); 142 143 TESTCASE(12, TestStdLibCtor); 144 TESTCASE(13, TestStdLibCtor1); 145 TESTCASE(14, TestStdLibCtor2); 146 TESTCASE(15, TestStdLibCtor3); 147 TESTCASE(16, TestStdLibAssign); 148 TESTCASE(17, TestStdLibAssign1); 149 TESTCASE(18, TestStdLibAssign2); 150 TESTCASE(19, TestStdLibGetch); 151 TESTCASE(20, TestStdLibCatenate); 152 TESTCASE(21, TestStdLibScan); 153 TESTCASE(22, TestStdLibScan1); 154 TESTCASE(23, TestStdLibScan2); 155 156 default: 157 name = ""; 158 return NULL; 159 } 160 return NULL; 161 } 162 TestCtor()163 UPerfFunction* StringPerformanceTest::TestCtor() 164 { 165 if (line_mode) { 166 return new StringPerfFunction(ctor, filelines_, numLines, uselen); 167 } else { 168 return new StringPerfFunction(ctor, StrBuffer, StrBufferLen, uselen); 169 } 170 } 171 TestCtor1()172 UPerfFunction* StringPerformanceTest::TestCtor1() 173 { 174 if (line_mode) { 175 return new StringPerfFunction(ctor1, filelines_, numLines, uselen); 176 } else { 177 return new StringPerfFunction(ctor1, StrBuffer, StrBufferLen, uselen); 178 } 179 } 180 TestCtor2()181 UPerfFunction* StringPerformanceTest::TestCtor2() 182 { 183 if (line_mode) { 184 return new StringPerfFunction(ctor2, filelines_, numLines, uselen); 185 } else { 186 return new StringPerfFunction(ctor2, StrBuffer, StrBufferLen, uselen); 187 } 188 } 189 TestCtor3()190 UPerfFunction* StringPerformanceTest::TestCtor3() 191 { 192 if (line_mode) { 193 return new StringPerfFunction(ctor3, filelines_, numLines, uselen); 194 } else { 195 return new StringPerfFunction(ctor3, StrBuffer, StrBufferLen, uselen); 196 } 197 } 198 TestAssign()199 UPerfFunction* StringPerformanceTest::TestAssign() 200 { 201 if (line_mode) { 202 return new StringPerfFunction(assign, filelines_, numLines, uselen); 203 } else { 204 return new StringPerfFunction(assign, StrBuffer, StrBufferLen, uselen); 205 } 206 } 207 TestAssign1()208 UPerfFunction* StringPerformanceTest::TestAssign1() 209 { 210 if (line_mode) { 211 return new StringPerfFunction(assign1, filelines_, numLines, uselen); 212 } else { 213 return new StringPerfFunction(assign1, StrBuffer, StrBufferLen, uselen); 214 } 215 } 216 TestAssign2()217 UPerfFunction* StringPerformanceTest::TestAssign2() 218 { 219 if (line_mode) { 220 return new StringPerfFunction(assign2, filelines_, numLines, uselen); 221 } else { 222 return new StringPerfFunction(assign2, StrBuffer, StrBufferLen, uselen); 223 } 224 } 225 226 TestGetch()227 UPerfFunction* StringPerformanceTest::TestGetch() 228 { 229 if (line_mode) { 230 return new StringPerfFunction(getch, filelines_, numLines, uselen); 231 } else { 232 return new StringPerfFunction(getch, StrBuffer, StrBufferLen, uselen); 233 } 234 } 235 TestCatenate()236 UPerfFunction* StringPerformanceTest::TestCatenate() 237 { 238 if (line_mode) { 239 return new StringPerfFunction(catenate, filelines_, numLines, uselen); 240 } else { 241 //return new StringPerfFunction(catenate, buffer, bufferLen, uselen); 242 return new StringPerfFunction(catenate, StrBuffer, StrBufferLen, uselen); 243 } 244 } 245 TestScan()246 UPerfFunction* StringPerformanceTest::TestScan() 247 { 248 if (line_mode) { 249 return new StringPerfFunction(scan, filelines_, numLines, uselen); 250 } else { 251 return new StringPerfFunction(scan, StrBuffer, StrBufferLen, uselen); 252 } 253 } 254 TestScan1()255 UPerfFunction* StringPerformanceTest::TestScan1() 256 { 257 if (line_mode) { 258 return new StringPerfFunction(scan1, filelines_, numLines, uselen); 259 } else { 260 return new StringPerfFunction(scan1, StrBuffer, StrBufferLen, uselen); 261 } 262 } 263 TestScan2()264 UPerfFunction* StringPerformanceTest::TestScan2() 265 { 266 if (line_mode) { 267 return new StringPerfFunction(scan2, filelines_, numLines, uselen); 268 } else { 269 return new StringPerfFunction(scan2, StrBuffer, StrBufferLen, uselen); 270 } 271 } 272 TestStdLibCtor()273 UPerfFunction* StringPerformanceTest::TestStdLibCtor() 274 { 275 if (line_mode) { 276 return new StringPerfFunction(StdLibCtor, filelines_, numLines, uselen); 277 } else { 278 return new StringPerfFunction(StdLibCtor, StrBuffer, StrBufferLen, uselen); 279 } 280 } 281 TestStdLibCtor1()282 UPerfFunction* StringPerformanceTest::TestStdLibCtor1() 283 { 284 if (line_mode) { 285 return new StringPerfFunction(StdLibCtor1, filelines_, numLines, uselen); 286 } else { 287 return new StringPerfFunction(StdLibCtor1, StrBuffer, StrBufferLen, uselen); 288 } 289 } 290 TestStdLibCtor2()291 UPerfFunction* StringPerformanceTest::TestStdLibCtor2() 292 { 293 if (line_mode) { 294 return new StringPerfFunction(StdLibCtor2, filelines_, numLines, uselen); 295 } else { 296 return new StringPerfFunction(StdLibCtor2, StrBuffer, StrBufferLen, uselen); 297 } 298 } 299 TestStdLibCtor3()300 UPerfFunction* StringPerformanceTest::TestStdLibCtor3() 301 { 302 if (line_mode) { 303 return new StringPerfFunction(StdLibCtor3, filelines_, numLines, uselen); 304 } else { 305 return new StringPerfFunction(StdLibCtor3, StrBuffer, StrBufferLen, uselen); 306 } 307 } 308 TestStdLibAssign()309 UPerfFunction* StringPerformanceTest::TestStdLibAssign() 310 { 311 if (line_mode) { 312 return new StringPerfFunction(StdLibAssign, filelines_, numLines, uselen); 313 } else { 314 return new StringPerfFunction(StdLibAssign, StrBuffer, StrBufferLen, uselen); 315 } 316 } 317 TestStdLibAssign1()318 UPerfFunction* StringPerformanceTest::TestStdLibAssign1() 319 { 320 if (line_mode) { 321 return new StringPerfFunction(StdLibAssign1, filelines_, numLines, uselen); 322 } else { 323 return new StringPerfFunction(StdLibAssign1, StrBuffer, StrBufferLen, uselen); 324 } 325 } 326 TestStdLibAssign2()327 UPerfFunction* StringPerformanceTest::TestStdLibAssign2() 328 { 329 if (line_mode) { 330 return new StringPerfFunction(StdLibAssign2, filelines_, numLines, uselen); 331 } else { 332 return new StringPerfFunction(StdLibAssign2, StrBuffer, StrBufferLen, uselen); 333 } 334 } 335 TestStdLibGetch()336 UPerfFunction* StringPerformanceTest::TestStdLibGetch() 337 { 338 if (line_mode) { 339 return new StringPerfFunction(StdLibGetch, filelines_, numLines, uselen); 340 } else { 341 return new StringPerfFunction(StdLibGetch, StrBuffer, StrBufferLen, uselen); 342 } 343 } 344 TestStdLibCatenate()345 UPerfFunction* StringPerformanceTest::TestStdLibCatenate() 346 { 347 if (line_mode) { 348 return new StringPerfFunction(StdLibCatenate, filelines_, numLines, uselen); 349 } else { 350 //return new StringPerfFunction(StdLibCatenate, buffer, bufferLen, uselen); 351 return new StringPerfFunction(StdLibCatenate, StrBuffer, StrBufferLen, uselen); 352 } 353 } 354 TestStdLibScan()355 UPerfFunction* StringPerformanceTest::TestStdLibScan() 356 { 357 if (line_mode) { 358 return new StringPerfFunction(StdLibScan, filelines_, numLines, uselen); 359 } else { 360 return new StringPerfFunction(StdLibScan, StrBuffer, StrBufferLen, uselen); 361 } 362 } 363 TestStdLibScan1()364 UPerfFunction* StringPerformanceTest::TestStdLibScan1() 365 { 366 if (line_mode) { 367 return new StringPerfFunction(StdLibScan1, filelines_, numLines, uselen); 368 } else { 369 return new StringPerfFunction(StdLibScan1, StrBuffer, StrBufferLen, uselen); 370 } 371 } 372 TestStdLibScan2()373 UPerfFunction* StringPerformanceTest::TestStdLibScan2() 374 { 375 if (line_mode) { 376 return new StringPerfFunction(StdLibScan2, filelines_, numLines, uselen); 377 } else { 378 return new StringPerfFunction(StdLibScan2, StrBuffer, StrBufferLen, uselen); 379 } 380 } 381 382 383