Commit dfa7c91
committed
We introduce a loop for finding the root of Aho-Corasick state,
which allows it to be better optimized by the compiler.
This shows a 1.67x improvement over the previous algorithm.
Additionally, the root finding loop may be replaced by a SIMD
loop when looking up to 16 bytes on supported platforms.
On supported platforms, the SIMD operation costs 16-bytes
of memory when compiling the pattern.
Benchmarks were run on arm64 macOS. Full-subject searches use a
4 MiB zero-filled subject, 100 searches per sample, and the median
of five samples. Values are searches per second. Counts through 16
use SIMD. 32 measures the scalar skip-loop improvement independently.
No match:
roots before after speedup
1 261 4228 16.20x
2 262 3414 13.03x
3 261 2101 8.05x
4 260 1805 6.94x
8 258 1147 4.45x
9 260 1052 4.05x
16 259 666 2.57x
32 258 430 1.67x
First match immediately after the 4 MiB prefix:
roots before after speedup
1 261 4218 16.16x
2 261 3354 12.85x
3 261 2072 7.94x
4 261 1780 6.82x
8 260 1141 4.39x
9 261 1039 3.98x
16 260 663 2.55x
32 261 430 1.65x
Pattern compilation uses 100,000 compilations per sample
and the median of seven samples. Values are compilations
per second:
roots before after change
2 628559 647903 +3.1%
3 580009 577474 -0.4%
4 516172 529459 +2.6%
8 393026 390299 -0.7%
9 367666 364475 -0.9%
16 257562 255865 -0.7%
32 150395 149792 -0.4%1 parent 50d69f7 commit dfa7c91
3 files changed
Lines changed: 365 additions & 6 deletions
File tree
- erts/emulator/beam
- lib/stdlib/test
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
41 | 41 | | |
42 | 42 | | |
43 | 43 | | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
44 | 57 | | |
45 | 58 | | |
46 | 59 | | |
| |||
164 | 177 | | |
165 | 178 | | |
166 | 179 | | |
| 180 | + | |
167 | 181 | | |
168 | 182 | | |
169 | 183 | | |
| |||
203 | 217 | | |
204 | 218 | | |
205 | 219 | | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
206 | 224 | | |
207 | 225 | | |
208 | 226 | | |
| |||
450 | 468 | | |
451 | 469 | | |
452 | 470 | | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
453 | 474 | | |
454 | 475 | | |
455 | 476 | | |
| |||
533 | 554 | | |
534 | 555 | | |
535 | 556 | | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
536 | 566 | | |
537 | 567 | | |
538 | 568 | | |
| |||
611 | 641 | | |
612 | 642 | | |
613 | 643 | | |
| 644 | + | |
| 645 | + | |
| 646 | + | |
| 647 | + | |
| 648 | + | |
| 649 | + | |
| 650 | + | |
| 651 | + | |
| 652 | + | |
| 653 | + | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
| 657 | + | |
| 658 | + | |
| 659 | + | |
| 660 | + | |
| 661 | + | |
| 662 | + | |
| 663 | + | |
| 664 | + | |
| 665 | + | |
| 666 | + | |
| 667 | + | |
| 668 | + | |
| 669 | + | |
| 670 | + | |
| 671 | + | |
| 672 | + | |
| 673 | + | |
| 674 | + | |
| 675 | + | |
| 676 | + | |
| 677 | + | |
| 678 | + | |
| 679 | + | |
| 680 | + | |
| 681 | + | |
| 682 | + | |
| 683 | + | |
| 684 | + | |
| 685 | + | |
| 686 | + | |
| 687 | + | |
| 688 | + | |
| 689 | + | |
| 690 | + | |
| 691 | + | |
| 692 | + | |
| 693 | + | |
| 694 | + | |
| 695 | + | |
| 696 | + | |
| 697 | + | |
| 698 | + | |
| 699 | + | |
| 700 | + | |
| 701 | + | |
| 702 | + | |
| 703 | + | |
| 704 | + | |
| 705 | + | |
| 706 | + | |
| 707 | + | |
| 708 | + | |
| 709 | + | |
| 710 | + | |
| 711 | + | |
| 712 | + | |
| 713 | + | |
| 714 | + | |
| 715 | + | |
| 716 | + | |
| 717 | + | |
| 718 | + | |
| 719 | + | |
| 720 | + | |
| 721 | + | |
| 722 | + | |
| 723 | + | |
| 724 | + | |
| 725 | + | |
| 726 | + | |
| 727 | + | |
| 728 | + | |
| 729 | + | |
| 730 | + | |
| 731 | + | |
| 732 | + | |
| 733 | + | |
| 734 | + | |
| 735 | + | |
| 736 | + | |
| 737 | + | |
| 738 | + | |
| 739 | + | |
| 740 | + | |
| 741 | + | |
| 742 | + | |
| 743 | + | |
614 | 744 | | |
615 | 745 | | |
616 | 746 | | |
| |||
638 | 768 | | |
639 | 769 | | |
640 | 770 | | |
| 771 | + | |
641 | 772 | | |
642 | 773 | | |
643 | 774 | | |
| |||
650 | 781 | | |
651 | 782 | | |
652 | 783 | | |
653 | | - | |
| 784 | + | |
| 785 | + | |
| 786 | + | |
| 787 | + | |
| 788 | + | |
| 789 | + | |
| 790 | + | |
| 791 | + | |
| 792 | + | |
| 793 | + | |
| 794 | + | |
| 795 | + | |
| 796 | + | |
| 797 | + | |
| 798 | + | |
| 799 | + | |
| 800 | + | |
| 801 | + | |
654 | 802 | | |
655 | 803 | | |
656 | 804 | | |
657 | 805 | | |
658 | 806 | | |
659 | 807 | | |
660 | 808 | | |
661 | | - | |
662 | | - | |
| 809 | + | |
| 810 | + | |
| 811 | + | |
663 | 812 | | |
664 | 813 | | |
665 | 814 | | |
| |||
730 | 879 | | |
731 | 880 | | |
732 | 881 | | |
| 882 | + | |
733 | 883 | | |
734 | 884 | | |
735 | 885 | | |
| |||
742 | 892 | | |
743 | 893 | | |
744 | 894 | | |
745 | | - | |
| 895 | + | |
| 896 | + | |
| 897 | + | |
| 898 | + | |
| 899 | + | |
| 900 | + | |
| 901 | + | |
| 902 | + | |
| 903 | + | |
| 904 | + | |
| 905 | + | |
| 906 | + | |
| 907 | + | |
| 908 | + | |
| 909 | + | |
| 910 | + | |
| 911 | + | |
| 912 | + | |
| 913 | + | |
746 | 914 | | |
747 | 915 | | |
748 | 916 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
25 | | - | |
| 25 | + | |
26 | 26 | | |
27 | 27 | | |
28 | 28 | | |
| |||
36 | 36 | | |
37 | 37 | | |
38 | 38 | | |
39 | | - | |
| 39 | + | |
| 40 | + | |
40 | 41 | | |
41 | 42 | | |
42 | 43 | | |
| |||
383 | 384 | | |
384 | 385 | | |
385 | 386 | | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
| 412 | + | |
| 413 | + | |
| 414 | + | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + | |
| 423 | + | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
386 | 440 | | |
387 | 441 | | |
388 | 442 | | |
| |||
0 commit comments