1 // © 2016 and later: Unicode, Inc. and others. 2 // License & terms of use: http://www.unicode.org/copyright.html 3 /* 4 ********************************************************************** 5 * Copyright (c) 2002-2009, International Business Machines * 6 * Corporation and others. All Rights Reserved. * 7 ********************************************************************** 8 */ 9 package com.ibm.icu.dev.test.perf; 10 11 import com.ibm.icu.text.Normalizer; 12 13 public class NormalizerPerformanceTest extends PerfTest { 14 15 String[] NFDFileLines; 16 String[] NFCFileLines; 17 String[] fileLines; 18 19 main(String[] args)20 public static void main(String[] args) throws Exception { 21 new NormalizerPerformanceTest().run(args); 22 } 23 setup(String[] args)24 protected void setup(String[] args) { 25 fileLines = readLines(fileName, encoding, bulk_mode); 26 NFDFileLines = normalizeInput(fileLines, Normalizer.NFD); 27 NFCFileLines = normalizeInput(fileLines, Normalizer.NFC); 28 } 29 30 // Test NFC Performance TestICU_NFC_NFD_Text()31 PerfTest.Function TestICU_NFC_NFD_Text() { 32 return new PerfTest.Function() { 33 public void call() { 34 for (int i = 0; i < NFDFileLines.length; i++) { 35 Normalizer.normalize(NFDFileLines[i], Normalizer.NFC); 36 } 37 } 38 39 public long getOperationsPerIteration() { 40 int totalChars = 0; 41 for (int i = 0; i < NFDFileLines.length; i++) { 42 totalChars = totalChars + NFDFileLines[i].length(); 43 } 44 return totalChars; 45 } 46 }; 47 } 48 49 PerfTest.Function TestICU_NFC_NFC_Text() { 50 return new PerfTest.Function() { 51 public void call() { 52 for (int i = 0; i < NFCFileLines.length; i++) { 53 Normalizer.normalize(NFCFileLines[i], Normalizer.NFC); 54 } 55 } 56 57 public long getOperationsPerIteration() { 58 int totalChars = 0; 59 for (int i = 0; i < NFCFileLines.length; i++) { 60 totalChars = totalChars + NFCFileLines[i].length(); 61 } 62 return totalChars; 63 } 64 }; 65 } 66 67 PerfTest.Function TestICU_NFC_Orig_Text() { 68 return new PerfTest.Function() { 69 public void call() { 70 for (int i = 0; i < fileLines.length; i++) { 71 Normalizer.normalize(fileLines[i], Normalizer.NFC); 72 } 73 } 74 75 public long getOperationsPerIteration() { 76 int totalChars = 0; 77 for (int i = 0; i < fileLines.length; i++) { 78 totalChars = totalChars + fileLines[i].length(); 79 } 80 return totalChars; 81 } 82 }; 83 } 84 85 // Test NFD Performance 86 PerfTest.Function TestICU_NFD_NFD_Text() { 87 return new PerfTest.Function() { 88 public void call() { 89 for (int i = 0; i < NFDFileLines.length; i++) { 90 Normalizer.normalize(NFDFileLines[i], Normalizer.NFD); 91 } 92 } 93 94 public long getOperationsPerIteration() { 95 int totalChars = 0; 96 for (int i = 0; i < NFDFileLines.length; i++) { 97 totalChars = totalChars + NFDFileLines[i].length(); 98 } 99 return totalChars; 100 } 101 }; 102 } 103 104 PerfTest.Function TestICU_NFD_NFC_Text() { 105 return new PerfTest.Function() { 106 public void call() { 107 for (int i = 0; i < NFCFileLines.length; i++) { 108 Normalizer.normalize(NFCFileLines[i], Normalizer.NFD); 109 } 110 } 111 112 public long getOperationsPerIteration() { 113 int totalChars = 0; 114 for (int i = 0; i < NFCFileLines.length; i++) { 115 totalChars = totalChars + NFCFileLines[i].length(); 116 } 117 return totalChars; 118 } 119 }; 120 } 121 122 PerfTest.Function TestICU_NFD_Orig_Text() { 123 return new PerfTest.Function() { 124 public void call() { 125 for (int i = 0; i < fileLines.length; i++) { 126 Normalizer.normalize(fileLines[i], Normalizer.NFD); 127 } 128 } 129 130 public long getOperationsPerIteration() { 131 int totalChars = 0; 132 for (int i = 0; i < fileLines.length; i++) { 133 totalChars = totalChars + fileLines[i].length(); 134 } 135 return totalChars; 136 } 137 }; 138 } 139 140 // Test NFC Performance 141 PerfTest.Function TestJDK_NFC_NFD_Text() { 142 return new PerfTest.Function() { 143 public void call() { 144 for (int i = 0; i < NFDFileLines.length; i++) 145 normalizerTest(NFDFileLines[i], true); 146 } 147 148 public long getOperationsPerIteration() { 149 int totalChars = 0; 150 for (int i = 0; i < NFDFileLines.length; i++) 151 totalChars = totalChars + NFDFileLines[i].length(); 152 return totalChars; 153 } 154 }; 155 } 156 157 PerfTest.Function TestJDK_NFC_NFC_Text() { 158 return new PerfTest.Function() { 159 public void call() { 160 for (int i = 0; i < NFCFileLines.length; i++) 161 normalizerTest(NFCFileLines[i], true); 162 } 163 164 public long getOperationsPerIteration() { 165 int totalChars = 0; 166 for (int i = 0; i < NFCFileLines.length; i++) 167 totalChars = totalChars + NFCFileLines[i].length(); 168 return totalChars; 169 } 170 }; 171 } 172 173 PerfTest.Function TestJDK_NFC_Orig_Text() { 174 return new PerfTest.Function() { 175 public void call() { 176 for (int i = 0; i < fileLines.length; i++) 177 normalizerTest(fileLines[i], true); 178 } 179 180 public long getOperationsPerIteration() { 181 int totalChars = 0; 182 for (int i = 0; i < fileLines.length; i++) 183 totalChars = totalChars + fileLines[i].length(); 184 return totalChars; 185 } 186 }; 187 } 188 189 // Test NFD Performance 190 PerfTest.Function TestJDK_NFD_NFD_Text() { 191 return new PerfTest.Function() { 192 public void call() { 193 for (int i = 0; i < NFDFileLines.length; i++) 194 normalizerTest(NFDFileLines[i], false); 195 } 196 197 public long getOperationsPerIteration() { 198 int totalChars = 0; 199 for (int i = 0; i < NFDFileLines.length; i++) 200 totalChars = totalChars + NFDFileLines[i].length(); 201 return totalChars; 202 } 203 }; 204 } 205 206 PerfTest.Function TestJDK_NFD_NFC_Text() { 207 return new PerfTest.Function() { 208 public void call() { 209 for (int i = 0; i < NFCFileLines.length; i++) 210 normalizerTest(NFCFileLines[i], false); 211 } 212 213 public long getOperationsPerIteration() { 214 int totalChars = 0; 215 for (int i = 0; i < NFCFileLines.length; i++) 216 totalChars = totalChars + NFCFileLines[i].length(); 217 return totalChars; 218 } 219 }; 220 } 221 222 PerfTest.Function TestJDK_NFD_Orig_Text() { 223 return new PerfTest.Function() { 224 public void call() { 225 for (int i = 0; i < fileLines.length; i++) 226 normalizerTest(fileLines[i], false); 227 } 228 229 public long getOperationsPerIteration() { 230 int totalChars = 0; 231 for (int i = 0; i < fileLines.length; i++) 232 totalChars = totalChars + fileLines[i].length(); 233 return totalChars; 234 } 235 }; 236 } 237 // Test FCD Performance 238 PerfTest.Function TestICU_FCD_NFD_Text() { 239 return new PerfTest.Function() { 240 public void call() { 241 for (int i = 0; i < NFDFileLines.length; i++) { 242 Normalizer.normalize(NFDFileLines[i], Normalizer.FCD); 243 } 244 } 245 246 public long getOperationsPerIteration() { 247 int totalChars = 0; 248 for (int i = 0; i < NFDFileLines.length; i++) { 249 totalChars = totalChars + NFDFileLines[i].length(); 250 } 251 return totalChars; 252 } 253 }; 254 } 255 256 PerfTest.Function TestICU_FCD_NFC_Text() { 257 return new PerfTest.Function() { 258 public void call() { 259 for (int i = 0; i < NFCFileLines.length; i++) { 260 Normalizer.normalize(NFCFileLines[i], Normalizer.FCD); 261 } 262 } 263 264 public long getOperationsPerIteration() { 265 int totalChars = 0; 266 for (int i = 0; i < NFCFileLines.length; i++) { 267 totalChars = totalChars + NFCFileLines[i].length(); 268 } 269 return totalChars; 270 } 271 }; 272 } 273 274 PerfTest.Function TestICU_FCD_Orig_Text() { 275 return new PerfTest.Function() { 276 public void call() { 277 for (int i = 0; i < fileLines.length; i++) { 278 Normalizer.normalize(fileLines[i], Normalizer.FCD); 279 } 280 } 281 282 public long getOperationsPerIteration() { 283 int totalChars = 0; 284 for (int i = 0; i < fileLines.length; i++) { 285 totalChars = totalChars + fileLines[i].length(); 286 } 287 return totalChars; 288 } 289 }; 290 } 291 292 // Test Quick Check Performance 293 PerfTest.Function TestQC_NFC_NFD_Text() { 294 return new PerfTest.Function() { 295 public void call() { 296 for (int i = 0; i < NFDFileLines.length; i++) { 297 Normalizer.quickCheck(NFDFileLines[i], Normalizer.NFC,0); 298 } 299 } 300 301 public long getOperationsPerIteration() { 302 int totalChars = 0; 303 for (int i = 0; i < NFDFileLines.length; i++) { 304 totalChars = totalChars + NFDFileLines[i].length(); 305 } 306 return totalChars; 307 } 308 }; 309 } 310 311 PerfTest.Function TestQC_NFC_NFC_Text() { 312 return new PerfTest.Function() { 313 public void call() { 314 for (int i = 0; i < NFCFileLines.length; i++) { 315 Normalizer.quickCheck(NFCFileLines[i], Normalizer.NFC,0); 316 } 317 } 318 319 public long getOperationsPerIteration() { 320 int totalChars = 0; 321 for (int i = 0; i < NFCFileLines.length; i++) { 322 totalChars = totalChars + NFCFileLines[i].length(); 323 } 324 return totalChars; 325 } 326 }; 327 } 328 329 PerfTest.Function TestQC_NFC_Orig_Text() { 330 return new PerfTest.Function() { 331 public void call() { 332 for (int i = 0; i < fileLines.length; i++) { 333 Normalizer.quickCheck(fileLines[i], Normalizer.NFC,0); 334 } 335 } 336 337 public long getOperationsPerIteration() { 338 int totalChars = 0; 339 for (int i = 0; i < fileLines.length; i++) { 340 totalChars = totalChars + fileLines[i].length(); 341 } 342 return totalChars; 343 } 344 }; 345 } 346 347 PerfTest.Function TestQC_NFD_NFD_Text() { 348 return new PerfTest.Function() { 349 public void call() { 350 for (int i = 0; i < NFDFileLines.length; i++) { 351 Normalizer.quickCheck(NFDFileLines[i], Normalizer.NFD,0); 352 } 353 } 354 355 public long getOperationsPerIteration() { 356 int totalChars = 0; 357 for (int i = 0; i < NFDFileLines.length; i++) { 358 totalChars = totalChars + NFDFileLines[i].length(); 359 } 360 return totalChars; 361 } 362 }; 363 } 364 365 PerfTest.Function TestQC_NFD_NFC_Text() { 366 return new PerfTest.Function() { 367 public void call() { 368 for (int i = 0; i < NFCFileLines.length; i++) { 369 Normalizer.quickCheck(NFCFileLines[i], Normalizer.NFD,0); 370 } 371 } 372 373 public long getOperationsPerIteration() { 374 int totalChars = 0; 375 for (int i = 0; i < NFCFileLines.length; i++) { 376 totalChars = totalChars + NFCFileLines[i].length(); 377 } 378 return totalChars; 379 } 380 }; 381 } 382 383 PerfTest.Function TestQC_NFD_Orig_Text() { 384 return new PerfTest.Function() { 385 public void call() { 386 for (int i = 0; i < fileLines.length; i++) { 387 Normalizer.quickCheck(fileLines[i], Normalizer.NFD,0); 388 } 389 } 390 391 public long getOperationsPerIteration() { 392 int totalChars = 0; 393 for (int i = 0; i < fileLines.length; i++) { 394 totalChars = totalChars + fileLines[i].length(); 395 } 396 return totalChars; 397 } 398 }; 399 } 400 401 PerfTest.Function TestQC_FCD_NFD_Text() { 402 return new PerfTest.Function() { 403 public void call() { 404 for (int i = 0; i < NFDFileLines.length; i++) { 405 Normalizer.quickCheck(NFDFileLines[i], Normalizer.FCD,0); 406 } 407 } 408 409 public long getOperationsPerIteration() { 410 int totalChars = 0; 411 for (int i = 0; i < NFDFileLines.length; i++) { 412 totalChars = totalChars + NFDFileLines[i].length(); 413 } 414 return totalChars; 415 } 416 }; 417 } 418 419 PerfTest.Function TestQC_FCD_NFC_Text() { 420 return new PerfTest.Function() { 421 public void call() { 422 for (int i = 0; i < NFCFileLines.length; i++) { 423 Normalizer.quickCheck(NFCFileLines[i], Normalizer.FCD,0); 424 } 425 } 426 427 public long getOperationsPerIteration() { 428 int totalChars = 0; 429 for (int i = 0; i < NFCFileLines.length; i++) { 430 totalChars = totalChars + NFCFileLines[i].length(); 431 } 432 return totalChars; 433 } 434 }; 435 } 436 437 PerfTest.Function TestQC_FCD_Orig_Text() { 438 return new PerfTest.Function() { 439 public void call() { 440 for (int i = 0; i < fileLines.length; i++) { 441 Normalizer.quickCheck(fileLines[i], Normalizer.FCD,0); 442 } 443 } 444 445 public long getOperationsPerIteration() { 446 int totalChars = 0; 447 for (int i = 0; i < fileLines.length; i++) { 448 totalChars = totalChars + fileLines[i].length(); 449 } 450 return totalChars; 451 } 452 }; 453 } 454 455 // Test isNormalized Performance 456 PerfTest.Function TestIsNormalized_NFC_NFD_Text() { 457 return new PerfTest.Function() { 458 public void call() { 459 for (int i = 0; i < NFDFileLines.length; i++) { 460 Normalizer.isNormalized(NFDFileLines[i], Normalizer.NFC, 0); 461 } 462 } 463 464 public long getOperationsPerIteration() { 465 int totalChars = 0; 466 for (int i = 0; i < NFDFileLines.length; i++) { 467 totalChars = totalChars + NFDFileLines[i].length(); 468 } 469 return totalChars; 470 } 471 }; 472 } 473 474 PerfTest.Function TestIsNormalized_NFC_NFC_Text() { 475 return new PerfTest.Function() { 476 public void call() { 477 for (int i = 0; i < NFCFileLines.length; i++) { 478 Normalizer.isNormalized(NFCFileLines[i], Normalizer.NFC, 0); 479 } 480 } 481 482 public long getOperationsPerIteration() { 483 int totalChars = 0; 484 for (int i = 0; i < NFCFileLines.length; i++) { 485 totalChars = totalChars + NFCFileLines[i].length(); 486 } 487 return totalChars; 488 } 489 }; 490 } 491 492 PerfTest.Function TestIsNormalized_NFC_Orig_Text() { 493 return new PerfTest.Function() { 494 public void call() { 495 for (int i = 0; i < fileLines.length; i++) { 496 Normalizer.isNormalized(fileLines[i], Normalizer.NFC, 0); 497 } 498 } 499 500 public long getOperationsPerIteration() { 501 int totalChars = 0; 502 for (int i = 0; i < fileLines.length; i++) { 503 totalChars = totalChars + fileLines[i].length(); 504 } 505 return totalChars; 506 } 507 }; 508 } 509 510 PerfTest.Function TestIsNormalized_NFD_NFD_Text() { 511 return new PerfTest.Function() { 512 public void call() { 513 for (int i = 0; i < NFDFileLines.length; i++) { 514 Normalizer.isNormalized(NFDFileLines[i], Normalizer.NFD, 0); 515 } 516 } 517 518 public long getOperationsPerIteration() { 519 int totalChars = 0; 520 for (int i = 0; i < NFDFileLines.length; i++) { 521 totalChars = totalChars + NFDFileLines[i].length(); 522 } 523 return totalChars; 524 } 525 }; 526 } 527 528 PerfTest.Function TestIsNormalized_NFD_NFC_Text() { 529 return new PerfTest.Function() { 530 public void call() { 531 for (int i = 0; i < NFCFileLines.length; i++) { 532 Normalizer.isNormalized(NFCFileLines[i], Normalizer.NFD, 0); 533 } 534 } 535 536 public long getOperationsPerIteration() { 537 int totalChars = 0; 538 for (int i = 0; i < NFCFileLines.length; i++) { 539 totalChars = totalChars + NFCFileLines[i].length(); 540 } 541 return totalChars; 542 } 543 }; 544 } 545 546 PerfTest.Function TestIsNormalized_NFD_Orig_Text() { 547 return new PerfTest.Function() { 548 public void call() { 549 for (int i = 0; i < fileLines.length; i++) { 550 Normalizer.isNormalized(fileLines[i], Normalizer.NFD, 0); 551 } 552 } 553 554 public long getOperationsPerIteration() { 555 int totalChars = 0; 556 for (int i = 0; i < fileLines.length; i++) { 557 totalChars = totalChars + fileLines[i].length(); 558 } 559 return totalChars; 560 } 561 }; 562 } 563 564 PerfTest.Function TestIsNormalized_FCD_NFD_Text() { 565 return new PerfTest.Function() { 566 public void call() { 567 for (int i = 0; i < NFDFileLines.length; i++) { 568 Normalizer.isNormalized(NFDFileLines[i], Normalizer.FCD, 0); 569 } 570 } 571 572 public long getOperationsPerIteration() { 573 int totalChars = 0; 574 for (int i = 0; i < NFDFileLines.length; i++) { 575 totalChars = totalChars + NFDFileLines[i].length(); 576 } 577 return totalChars; 578 } 579 }; 580 } 581 582 PerfTest.Function TestIsNormalized_FCD_NFC_Text() { 583 return new PerfTest.Function() { 584 public void call() { 585 for (int i = 0; i < NFCFileLines.length; i++) { 586 Normalizer.isNormalized(NFCFileLines[i], Normalizer.FCD, 0); 587 } 588 } 589 590 public long getOperationsPerIteration() { 591 int totalChars = 0; 592 for (int i = 0; i < NFCFileLines.length; i++) { 593 totalChars = totalChars + NFCFileLines[i].length(); 594 } 595 return totalChars; 596 } 597 }; 598 } 599 600 PerfTest.Function TestIsNormalized_FCD_Orig_Text() { 601 return new PerfTest.Function() { 602 public void call() { 603 for (int i = 0; i < fileLines.length; i++) { 604 Normalizer.isNormalized(fileLines[i], Normalizer.FCD, 0); 605 } 606 } 607 608 public long getOperationsPerIteration() { 609 int totalChars = 0; 610 for (int i = 0; i < fileLines.length; i++) { 611 totalChars = totalChars + fileLines[i].length(); 612 } 613 return totalChars; 614 } 615 }; 616 } 617 618 /* 619 private void printUsage() { 620 System.out.println("Usage: " + this.getClass().getName() + " [OPTIONS] fileName\n" 621 + "\t-f or --fileName \tfile to be used as test data\n" 622 + "\t-s or --sourceDir \tsource directory for files followed by path\n" 623 + "\t-e or --encoding \tencoding of source files\n" 624 + "\t-b or --bulkMode \tnormalize whole file at once\n" 625 + "\t-l or --lineMode \tnormalize file one line at a time\n" 626 ); 627 System.exit(1); 628 } 629 */ 630 631 String[] normalizeInput(String[] src, Normalizer.Mode mode) { 632 String[] dest = new String[src.length]; 633 for (int i = 0; i < src.length; i++) { 634 dest[i] = Normalizer.normalize(src[i], mode); 635 } 636 637 return dest; 638 } 639 640 /* 641 void normalizerInit(boolean compose) { 642 Class normalizer; 643 boolean sun; 644 645 try { 646 normalizer = Class.forName("java.text.Normalizer"); 647 sun = false; 648 } catch (ClassNotFoundException ex) { 649 try { 650 normalizer = Class.forName("sun.text.Normalizer"); 651 sun = true; 652 } catch (ClassNotFoundException ex2) { 653 throw new RuntimeException( 654 "Could not find sun.text.Normalizer nor java.text.Normalizer and their required subclasses"); 655 } 656 } 657 658 try { 659 if (sun) { 660 normalizerArgs = new Object[] { null, null, new Integer(0) }; 661 normalizerArgs[1] = normalizer.getField(compose ? "COMPOSE" : "DECOMP").get(null); 662 normalizerMethod = normalizer.getMethod("normalize", new Class[] { String.class, normalizerArgs[1].getClass(), int.class }); 663 // sun.text.Normalizer.normalize(line, compose 664 // ? sun.text.Normalizer.COMPOSE 665 // : sun.text.Normalizer.DECOMP, 0); 666 } else { 667 normalizerArgs = new Object[] { null, null }; 668 normalizerArgs[1] = Class.forName("java.text.Normalizer$Form").getField(compose ? "NFC" : "NFD").get(null); 669 normalizerMethod = normalizer.getMethod("normalize", new Class[] { CharSequence.class, normalizerArgs[1].getClass()}); 670 // java.text.Normalizer.normalize(line, compose 671 // ? java.text.Normalizer.Form.NFC 672 // : java.text.Normalizer.Form.NFD); 673 } 674 } catch (Exception ex) { 675 ex.printStackTrace(); 676 throw new RuntimeException("Reflection error -- could not load the JDK normalizer (" + normalizer.getName() + ")"); 677 } 678 } 679 680 void normalizerTest(String line) { 681 try { 682 normalizerArgs[0] = line; 683 normalizerMethod.invoke(line, normalizerArgs); 684 } catch (Exception ex) { 685 if (ex instanceof InvocationTargetException) { 686 Throwable cause = ex.getCause(); 687 cause.printStackTrace(); 688 throw new RuntimeException(cause.getMessage()); 689 } else { 690 throw new RuntimeException("Reflection error -- could not run the JDK normalizer"); 691 } 692 } 693 } 694 */ 695 696 void normalizerTest(String line, boolean compose) { 697 // sun.text.Normalizer.normalize(line, compose 698 // ? sun.text.Normalizer.COMPOSE 699 // : sun.text.Normalizer.DECOMP, 0); 700 java.text.Normalizer.normalize(line, compose 701 ? java.text.Normalizer.Form.NFC 702 : java.text.Normalizer.Form.NFD); 703 } 704 } 705