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