Commit 85e11c7
Add HashMap.alterF.
The implementation utilizes specialized versions of lookup, insert, and delete
to guarantee that the hash is only computed once and key comparisons are done at
most once.
Testing:
- Property tests are added to verify that the behaviour is equivalent to that of
Data.Map.alterF.
Benchmarking (TODO):
- TODO: compare to alter
- TODO: compare to similar operations (insert, delete, update)
Open questions/follow-ups:
- Is the use of ptrEq in alterF valid? The values must be in WHNF for it to give
correct answers.
- Verify that strictness is enforced properly in Data.HashMap.Strict.alterF.
- Make another pass to determine if more checks can be removed from optimized
insert and delete operations.
- Benchmark a version of alter using specialized insert and delete operations
(maybe do this as a follow-up PR).
Add alter and alterF benchmarks.
------------------------------
alter benchmark results:
------------------------------
benchmarking HashMap/alterInsert/String
time 1.683 ms (1.621 ms .. 1.749 ms)
0.990 R² (0.983 R² .. 0.995 R²)
mean 1.479 ms (1.422 ms .. 1.528 ms)
std dev 165.1 μs (139.7 μs .. 201.8 μs)
variance introduced by outliers: 73% (severely inflated)
benchmarking HashMap/alterInsert/ByteString
time 1.786 ms (1.753 ms .. 1.818 ms)
0.997 R² (0.996 R² .. 0.998 R²)
mean 1.624 ms (1.597 ms .. 1.651 ms)
std dev 91.86 μs (76.01 μs .. 111.3 μs)
variance introduced by outliers: 41% (moderately inflated)
benchmarking HashMap/alterInsert/Int
time 1.001 ms (983.6 μs .. 1.020 ms)
0.996 R² (0.992 R² .. 0.998 R²)
mean 953.3 μs (938.2 μs .. 1.001 ms)
std dev 72.50 μs (36.53 μs .. 132.3 μs)
variance introduced by outliers: 60% (severely inflated)
benchmarking HashMap/alterInsert-dup/String
time 660.3 μs (651.1 μs .. 670.4 μs)
0.999 R² (0.998 R² .. 1.000 R²)
mean 618.6 μs (609.6 μs .. 627.9 μs)
std dev 27.19 μs (22.38 μs .. 34.47 μs)
variance introduced by outliers: 35% (moderately inflated)
benchmarking HashMap/alterInsert-dup/ByteString
time 393.6 μs (384.3 μs .. 407.0 μs)
0.996 R² (0.992 R² .. 1.000 R²)
mean 365.2 μs (359.4 μs .. 376.3 μs)
std dev 23.47 μs (13.93 μs .. 36.85 μs)
variance introduced by outliers: 57% (severely inflated)
benchmarking HashMap/alterInsert-dup/Int
time 469.0 μs (452.9 μs .. 500.1 μs)
0.975 R² (0.934 R² .. 0.999 R²)
mean 442.5 μs (431.8 μs .. 480.6 μs)
std dev 54.03 μs (18.24 μs .. 108.2 μs)
variance introduced by outliers: 83% (severely inflated)
benchmarking HashMap/alterDelete/String
time 1.321 ms (1.207 ms .. 1.505 ms)
0.936 R² (0.874 R² .. 0.995 R²)
mean 1.194 ms (1.153 ms .. 1.294 ms)
std dev 186.0 μs (80.28 μs .. 338.8 μs)
variance introduced by outliers: 86% (severely inflated)
benchmarking HashMap/alterDelete/ByteString
time 937.2 μs (909.4 μs .. 971.3 μs)
0.993 R² (0.986 R² .. 0.998 R²)
mean 892.4 μs (880.9 μs .. 914.6 μs)
std dev 48.85 μs (34.35 μs .. 78.75 μs)
variance introduced by outliers: 43% (moderately inflated)
benchmarking HashMap/alterDelete/Int
time 521.2 μs (500.9 μs .. 555.8 μs)
0.983 R² (0.968 R² .. 0.999 R²)
mean 484.0 μs (469.8 μs .. 514.1 μs)
std dev 56.59 μs (34.48 μs .. 84.56 μs)
variance introduced by outliers: 81% (severely inflated)
benchmarking HashMap/alterDelete-miss/String
time 260.2 μs (258.8 μs .. 262.0 μs)
0.999 R² (0.999 R² .. 1.000 R²)
mean 243.6 μs (240.2 μs .. 246.7 μs)
std dev 9.586 μs (7.859 μs .. 11.63 μs)
variance introduced by outliers: 34% (moderately inflated)
benchmarking HashMap/alterDelete-miss/ByteString
time 271.2 μs (266.7 μs .. 276.9 μs)
0.996 R² (0.993 R² .. 0.999 R²)
mean 255.1 μs (250.4 μs .. 263.0 μs)
std dev 17.36 μs (11.72 μs .. 27.42 μs)
variance introduced by outliers: 61% (severely inflated)
benchmarking HashMap/alterDelete-miss/Int
time 334.5 μs (331.7 μs .. 337.7 μs)
0.998 R² (0.996 R² .. 1.000 R²)
mean 314.7 μs (310.4 μs .. 319.2 μs)
std dev 12.88 μs (10.69 μs .. 15.88 μs)
variance introduced by outliers: 35% (moderately inflated)
------------------------------
alterF benchmark results
------------------------------
benchmarking HashMap/alterFInsert/String
time 1.853 ms (1.790 ms .. 1.911 ms)
0.991 R² (0.987 R² .. 0.994 R²)
mean 1.570 ms (1.499 ms .. 1.632 ms)
std dev 199.4 μs (165.5 μs .. 261.6 μs)
variance introduced by outliers: 78% (severely inflated)
benchmarking HashMap/alterFInsert/ByteString
time 1.742 ms (1.709 ms .. 1.779 ms)
0.996 R² (0.993 R² .. 0.998 R²)
mean 1.630 ms (1.605 ms .. 1.663 ms)
std dev 89.00 μs (70.92 μs .. 118.1 μs)
variance introduced by outliers: 39% (moderately inflated)
benchmarking HashMap/alterFInsert/Int
time 1.293 ms (1.263 ms .. 1.332 ms)
0.993 R² (0.986 R² .. 0.997 R²)
mean 1.248 ms (1.223 ms .. 1.280 ms)
std dev 83.87 μs (63.48 μs .. 124.8 μs)
variance introduced by outliers: 52% (severely inflated)
benchmarking HashMap/alterFInsert-dup/String
time 698.0 μs (687.5 μs .. 712.2 μs)
0.998 R² (0.996 R² .. 0.999 R²)
mean 656.8 μs (646.4 μs .. 668.2 μs)
std dev 33.99 μs (27.76 μs .. 44.58 μs)
variance introduced by outliers: 42% (moderately inflated)
benchmarking HashMap/alterFInsert-dup/ByteString
time 386.8 μs (380.9 μs .. 395.1 μs)
0.997 R² (0.995 R² .. 1.000 R²)
mean 361.1 μs (354.3 μs .. 369.2 μs)
std dev 21.50 μs (15.61 μs .. 30.72 μs)
variance introduced by outliers: 53% (severely inflated)
benchmarking HashMap/alterFInsert-dup/Int
time 712.0 μs (695.4 μs .. 729.9 μs)
0.969 R² (0.938 R² .. 0.992 R²)
mean 751.9 μs (705.2 μs .. 873.4 μs)
std dev 202.2 μs (117.2 μs .. 321.1 μs)
variance introduced by outliers: 95% (severely inflated)
benchmarking HashMap/alterFDelete/String
time 1.351 ms (1.321 ms .. 1.398 ms)
0.994 R² (0.990 R² .. 0.998 R²)
mean 1.323 ms (1.303 ms .. 1.350 ms)
std dev 73.00 μs (53.15 μs .. 96.86 μs)
variance introduced by outliers: 41% (moderately inflated)
benchmarking HashMap/alterFDelete/ByteString
time 976.5 μs (968.2 μs .. 985.7 μs)
0.999 R² (0.998 R² .. 1.000 R²)
mean 914.0 μs (900.8 μs .. 927.8 μs)
std dev 40.05 μs (33.51 μs .. 48.09 μs)
variance introduced by outliers: 33% (moderately inflated)
benchmarking HashMap/alterFDelete/Int
time 687.6 μs (675.4 μs .. 701.4 μs)
0.997 R² (0.995 R² .. 0.999 R²)
mean 652.3 μs (642.0 μs .. 663.5 μs)
std dev 33.69 μs (27.07 μs .. 45.25 μs)
variance introduced by outliers: 42% (moderately inflated)
benchmarking HashMap/alterFDelete-miss/String
time 309.6 μs (307.2 μs .. 312.4 μs)
0.999 R² (0.998 R² .. 1.000 R²)
mean 289.2 μs (284.4 μs .. 294.2 μs)
std dev 15.43 μs (12.33 μs .. 23.13 μs)
variance introduced by outliers: 49% (moderately inflated)
benchmarking HashMap/alterFDelete-miss/ByteString
time 252.8 μs (250.1 μs .. 256.7 μs)
0.998 R² (0.996 R² .. 0.999 R²)
mean 239.5 μs (235.7 μs .. 244.3 μs)
std dev 12.55 μs (9.774 μs .. 16.69 μs)
variance introduced by outliers: 48% (moderately inflated)
benchmarking HashMap/alterFDelete-miss/Int
time 424.1 μs (420.4 μs .. 429.6 μs)
0.998 R² (0.997 R² .. 0.999 R²)
mean 403.6 μs (398.1 μs .. 410.7 μs)
std dev 19.02 μs (14.48 μs .. 27.70 μs)
variance introduced by outliers: 40% (moderately inflated)
------------------------------
insert/delete benchmark results (for comparison
------------------------------
benchmarking HashMap/insert/String
time 1.655 ms (1.586 ms .. 1.753 ms)
0.958 R² (0.927 R² .. 0.984 R²)
mean 1.482 ms (1.402 ms .. 1.601 ms)
std dev 290.7 μs (221.3 μs .. 371.7 μs)
variance introduced by outliers: 91% (severely inflated)
benchmarking HashMap/insert/ByteString
time 1.750 ms (1.723 ms .. 1.780 ms)
0.996 R² (0.993 R² .. 0.998 R²)
mean 1.586 ms (1.546 ms .. 1.624 ms)
std dev 122.7 μs (100.3 μs .. 151.5 μs)
variance introduced by outliers: 56% (severely inflated)
benchmarking HashMap/insert/Int
time 1.010 ms (992.7 μs .. 1.028 ms)
0.995 R² (0.992 R² .. 0.997 R²)
mean 982.5 μs (968.5 μs .. 1.003 ms)
std dev 50.67 μs (36.35 μs .. 71.95 μs)
variance introduced by outliers: 39% (moderately inflated)
benchmarking HashMap/insert-dup/String
time 663.6 μs (656.5 μs .. 674.1 μs)
0.997 R² (0.994 R² .. 0.999 R²)
mean 634.1 μs (623.2 μs .. 646.8 μs)
std dev 37.31 μs (28.16 μs .. 49.15 μs)
variance introduced by outliers: 48% (moderately inflated)
benchmarking HashMap/insert-dup/ByteString
time 400.9 μs (389.2 μs .. 419.9 μs)
0.968 R² (0.923 R² .. 0.997 R²)
mean 388.8 μs (371.7 μs .. 434.5 μs)
std dev 76.86 μs (23.58 μs .. 132.4 μs)
variance introduced by outliers: 94% (severely inflated)
benchmarking HashMap/insert-dup/Int
time 444.2 μs (436.3 μs .. 451.2 μs)
0.989 R² (0.971 R² .. 0.998 R²)
mean 448.7 μs (429.7 μs .. 505.9 μs)
std dev 93.00 μs (29.20 μs .. 185.2 μs)
variance introduced by outliers: 93% (severely inflated)
benchmarking HashMap/delete/String
time 1.209 ms (1.169 ms .. 1.248 ms)
0.993 R² (0.989 R² .. 0.997 R²)
mean 1.170 ms (1.144 ms .. 1.237 ms)
std dev 113.0 μs (57.14 μs .. 240.5 μs)
variance introduced by outliers: 69% (severely inflated)
benchmarking HashMap/delete/ByteString
time 949.2 μs (915.7 μs .. 986.9 μs)
0.984 R² (0.975 R² .. 0.991 R²)
mean 937.6 μs (902.6 μs .. 986.2 μs)
std dev 132.1 μs (89.29 μs .. 188.1 μs)
variance introduced by outliers: 84% (severely inflated)
benchmarking HashMap/delete/Int
time 496.8 μs (492.6 μs .. 501.2 μs)
0.999 R² (0.998 R² .. 0.999 R²)
mean 466.4 μs (459.3 μs .. 472.4 μs)
std dev 20.02 μs (16.46 μs .. 24.88 μs)
variance introduced by outliers: 35% (moderately inflated)
benchmarking HashMap/delete-miss/String
time 261.1 μs (259.7 μs .. 262.6 μs)
0.998 R² (0.995 R² .. 1.000 R²)
mean 247.0 μs (242.8 μs .. 257.8 μs)
std dev 19.51 μs (7.661 μs .. 38.23 μs)
variance introduced by outliers: 68% (severely inflated)
benchmarking HashMap/delete-miss/ByteString
time 271.7 μs (253.7 μs .. 295.2 μs)
0.973 R² (0.962 R² .. 0.986 R²)
mean 262.5 μs (253.3 μs .. 272.8 μs)
std dev 30.78 μs (24.10 μs .. 39.88 μs)
variance introduced by outliers: 82% (severely inflated)
benchmarking HashMap/delete-miss/Int
time 316.5 μs (312.8 μs .. 320.4 μs)
0.999 R² (0.999 R² .. 0.999 R²)
mean 295.7 μs (291.4 μs .. 299.9 μs)
std dev 12.22 μs (9.975 μs .. 15.17 μs)
variance introduced by outliers: 36% (moderately inflated)1 parent 180891e commit 85e11c7
File tree
6 files changed
+433
-4
lines changed- Data/HashMap
- benchmarks
- tests
6 files changed
+433
-4
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
1 | 5 | | |
2 | 6 | | |
3 | 7 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
| 31 | + | |
31 | 32 | | |
32 | 33 | | |
33 | 34 | | |
| |||
89 | 90 | | |
90 | 91 | | |
91 | 92 | | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
92 | 99 | | |
93 | 100 | | |
94 | 101 | | |
| |||
448 | 455 | | |
449 | 456 | | |
450 | 457 | | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
| 461 | + | |
| 462 | + | |
| 463 | + | |
| 464 | + | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
| 478 | + | |
| 479 | + | |
| 480 | + | |
| 481 | + | |
| 482 | + | |
| 483 | + | |
| 484 | + | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
| 492 | + | |
451 | 493 | | |
452 | 494 | | |
453 | 495 | | |
| |||
523 | 565 | | |
524 | 566 | | |
525 | 567 | | |
| 568 | + | |
| 569 | + | |
| 570 | + | |
| 571 | + | |
| 572 | + | |
| 573 | + | |
| 574 | + | |
| 575 | + | |
| 576 | + | |
| 577 | + | |
| 578 | + | |
| 579 | + | |
| 580 | + | |
| 581 | + | |
| 582 | + | |
| 583 | + | |
| 584 | + | |
| 585 | + | |
| 586 | + | |
| 587 | + | |
| 588 | + | |
| 589 | + | |
| 590 | + | |
| 591 | + | |
| 592 | + | |
| 593 | + | |
| 594 | + | |
| 595 | + | |
| 596 | + | |
| 597 | + | |
| 598 | + | |
| 599 | + | |
| 600 | + | |
| 601 | + | |
| 602 | + | |
| 603 | + | |
| 604 | + | |
| 605 | + | |
| 606 | + | |
| 607 | + | |
| 608 | + | |
| 609 | + | |
| 610 | + | |
| 611 | + | |
| 612 | + | |
| 613 | + | |
| 614 | + | |
| 615 | + | |
| 616 | + | |
| 617 | + | |
| 618 | + | |
| 619 | + | |
| 620 | + | |
| 621 | + | |
| 622 | + | |
| 623 | + | |
| 624 | + | |
| 625 | + | |
| 626 | + | |
| 627 | + | |
| 628 | + | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
| 636 | + | |
| 637 | + | |
| 638 | + | |
| 639 | + | |
| 640 | + | |
| 641 | + | |
| 642 | + | |
| 643 | + | |
| 644 | + | |
| 645 | + | |
| 646 | + | |
| 647 | + | |
| 648 | + | |
| 649 | + | |
| 650 | + | |
| 651 | + | |
| 652 | + | |
| 653 | + | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
| 657 | + | |
| 658 | + | |
| 659 | + | |
| 660 | + | |
| 661 | + | |
| 662 | + | |
| 663 | + | |
| 664 | + | |
526 | 665 | | |
527 | 666 | | |
528 | 667 | | |
| |||
710 | 849 | | |
711 | 850 | | |
712 | 851 | | |
| 852 | + | |
| 853 | + | |
| 854 | + | |
| 855 | + | |
| 856 | + | |
| 857 | + | |
| 858 | + | |
| 859 | + | |
| 860 | + | |
| 861 | + | |
| 862 | + | |
| 863 | + | |
| 864 | + | |
| 865 | + | |
| 866 | + | |
| 867 | + | |
| 868 | + | |
| 869 | + | |
| 870 | + | |
| 871 | + | |
| 872 | + | |
| 873 | + | |
| 874 | + | |
| 875 | + | |
| 876 | + | |
| 877 | + | |
| 878 | + | |
| 879 | + | |
| 880 | + | |
| 881 | + | |
| 882 | + | |
| 883 | + | |
| 884 | + | |
| 885 | + | |
| 886 | + | |
| 887 | + | |
| 888 | + | |
| 889 | + | |
| 890 | + | |
| 891 | + | |
| 892 | + | |
| 893 | + | |
| 894 | + | |
| 895 | + | |
| 896 | + | |
| 897 | + | |
| 898 | + | |
| 899 | + | |
| 900 | + | |
| 901 | + | |
| 902 | + | |
| 903 | + | |
| 904 | + | |
| 905 | + | |
| 906 | + | |
| 907 | + | |
| 908 | + | |
| 909 | + | |
| 910 | + | |
713 | 911 | | |
714 | 912 | | |
715 | 913 | | |
| |||
751 | 949 | | |
752 | 950 | | |
753 | 951 | | |
| 952 | + | |
754 | 953 | | |
755 | 954 | | |
756 | 955 | | |
757 | 956 | | |
758 | 957 | | |
759 | 958 | | |
| 959 | + | |
| 960 | + | |
| 961 | + | |
| 962 | + | |
| 963 | + | |
| 964 | + | |
| 965 | + | |
| 966 | + | |
| 967 | + | |
| 968 | + | |
| 969 | + | |
| 970 | + | |
| 971 | + | |
| 972 | + | |
| 973 | + | |
| 974 | + | |
| 975 | + | |
| 976 | + | |
| 977 | + | |
| 978 | + | |
| 979 | + | |
| 980 | + | |
| 981 | + | |
| 982 | + | |
| 983 | + | |
| 984 | + | |
| 985 | + | |
| 986 | + | |
| 987 | + | |
| 988 | + | |
| 989 | + | |
| 990 | + | |
| 991 | + | |
| 992 | + | |
| 993 | + | |
| 994 | + | |
| 995 | + | |
| 996 | + | |
| 997 | + | |
| 998 | + | |
| 999 | + | |
| 1000 | + | |
| 1001 | + | |
| 1002 | + | |
| 1003 | + | |
| 1004 | + | |
| 1005 | + | |
760 | 1006 | | |
761 | 1007 | | |
762 | 1008 | | |
| |||
1209 | 1455 | | |
1210 | 1456 | | |
1211 | 1457 | | |
| 1458 | + | |
| 1459 | + | |
| 1460 | + | |
| 1461 | + | |
| 1462 | + | |
| 1463 | + | |
| 1464 | + | |
| 1465 | + | |
| 1466 | + | |
| 1467 | + | |
| 1468 | + | |
| 1469 | + | |
| 1470 | + | |
1212 | 1471 | | |
1213 | 1472 | | |
1214 | 1473 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
46 | 46 | | |
47 | 47 | | |
48 | 48 | | |
| 49 | + | |
49 | 50 | | |
50 | 51 | | |
51 | 52 | | |
| |||
0 commit comments