Skip to content

Use binCheck{L,R} where possible #1136

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 26, 2025
Merged

Conversation

meooow25
Copy link
Contributor

Skips unnecessary Nil checks.

@meooow25
Copy link
Contributor Author

Benchmarks on GHC 9.10.1

IntSet

Show
Name                                Time - - - - - - - -    Allocated - - - - -
                                         A       B     %         A       B     %
compare:dense                       421 ns  415 ns   -1%     24 B    24 B    +0%
compare:sparse                       27 μs   28 μs   +5%     36 B    48 B   +33%
delete                               65 μs   59 μs   -9%    604 KB  604 KB   +0%
deleteMax                            16 ns   16 ns   +0%    160 B   160 B    +0%
deleteMin                            53 ns   56 ns   +5%    648 B   648 B    +0%
difference                          692 ns  684 ns   -1%    3.5 KB  3.5 KB   +0%
disjoint:false                       29 ns   29 ns   +0%     32 B    32 B    +0%
disjoint:true                       415 ns  411 ns   -1%     32 B    32 B    +0%
eq                                  338 ns  337 ns   +0%     24 B    24 B    +0%
filter                               19 μs   20 μs   +1%     68 KB   68 KB   +0%
findMax                             7.1 ns  7.0 ns   -1%     40 B    40 B    +0%
findMin                             8.5 ns  8.4 ns   -1%     40 B    40 B    +0%
folds:dense.foldMap_elem            5.4 μs  5.4 μs   +0%     27 B    27 B    +0%
folds:dense.foldMap_traverseSum     4.6 μs  4.5 μs   +0%    1.0 KB  1.0 KB   +0%
folds:dense.foldl'_sum              4.4 μs  4.4 μs   +0%     43 B    43 B    +0%
folds:dense.foldl_cpsOneShotSum     5.8 μs  5.8 μs   +0%    2.5 KB  2.5 KB   +0%
folds:dense.foldl_cpsSum            6.3 μs  6.2 μs   +0%    5.1 KB  5.1 KB   +0%
folds:dense.foldl_elem              5.7 μs  5.7 μs   +0%    2.0 KB  2.0 KB   +0%
folds:dense.foldl_traverseSum       6.0 μs  6.0 μs   +0%    5.1 KB  5.1 KB   +0%
folds:dense.foldr'_sum              5.6 μs  5.6 μs   +0%     43 B    43 B    +0%
folds:dense.foldr_cpsOneShotSum     5.7 μs  5.8 μs   +3%    2.5 KB  2.5 KB   +0%
folds:dense.foldr_cpsSum            5.9 μs  5.9 μs   +0%    5.1 KB  5.1 KB   +0%
folds:dense.foldr_elem              4.8 μs  4.8 μs   +0%    2.0 KB  2.0 KB   +0%
folds:dense.foldr_traverseSum       4.9 μs  4.9 μs   -1%    5.1 KB  5.1 KB   +0%
folds:sparse.foldMap_elem            18 μs   18 μs   +0%     36 B    37 B    +2%
folds:sparse.foldMap_traverseSum     20 μs   20 μs   -1%     64 KB   64 KB   +0%
folds:sparse.foldl'_sum              14 μs   14 μs   -1%     52 B    45 B   -13%
folds:sparse.foldl_cpsOneShotSum     38 μs   38 μs   -1%    160 KB  160 KB   +0%
folds:sparse.foldl_cpsSum            61 μs   61 μs   +0%    320 KB  320 KB   +0%
folds:sparse.foldl_elem              30 μs   30 μs   +0%    128 KB  128 KB   +0%
folds:sparse.foldl_traverseSum       55 μs   55 μs   -1%    320 KB  320 KB   +0%
folds:sparse.foldr'_sum              24 μs   24 μs   -1%     52 B    52 B    +0%
folds:sparse.foldr_cpsOneShotSum     30 μs   30 μs   +0%    160 KB  160 KB   +0%
folds:sparse.foldr_cpsSum            55 μs   55 μs   +0%    320 KB  320 KB   +0%
folds:sparse.foldr_elem              20 μs   20 μs   +0%    128 KB  128 KB   +0%
folds:sparse.foldr_traverseSum       46 μs   46 μs   +0%    320 KB  320 KB   +0%
fromAscList                          17 μs   16 μs   +0%    5.6 KB  5.6 KB   +0%
fromAscList:fusion                  4.0 μs  4.0 μs   +0%    5.5 KB  5.5 KB   +0%
fromAscList:sparse                   38 μs   38 μs   -1%    352 KB  352 KB   +0%
fromAscList:sparse:fusion            34 μs   34 μs   +0%    352 KB  352 KB   +0%
fromList:asc                         45 μs   46 μs   +0%    480 KB  480 KB   +0%
fromList:asc:fusion                  39 μs   39 μs   +0%    480 KB  480 KB   +0%
fromList:asc:sparse                  96 μs   94 μs   -1%    864 KB  864 KB   +0%
fromList:asc:sparse:fusion           88 μs   88 μs   +0%    864 KB  864 KB   +0%
fromList:random                     474 μs  471 μs   +0%    1.5 MB  1.5 MB   +0%
fromList:random:fusion              461 μs  458 μs   +0%    1.5 MB  1.5 MB   +0%
fromRange                           324 ns  324 ns   +0%    3.6 KB  3.6 KB   +0%
fromRange:small                      11 ns   11 ns   +0%    112 B   112 B    +0%
insert                               46 μs   46 μs   +0%    480 KB  480 KB   +0%
instanceOrd:dense                   151 ms  150 ms   +0%    243 MB  243 MB   +0%
instanceOrd:sparse                  470 ms  468 ms   +0%    307 MB  307 MB   +0%
intersection                        666 ns  662 ns   +0%    3.6 KB  3.6 KB   +0%
map                                  55 μs   55 μs   +0%    613 KB  613 KB   +0%
member                               41 μs   41 μs   +0%     71 B    73 B    +2%
null.intersection:false             655 ns  654 ns   +0%    3.6 KB  3.6 KB   +0%
null.intersection:true              397 ns  398 ns   +0%     32 B    32 B    +0%
partition                            20 μs   20 μs   +0%     71 KB   71 KB   +0%
spanAntitone:dense                   85 ns   82 ns   -3%    536 B   536 B    +0%
spanAntitone:sparse                 100 ns   87 ns  -13%    688 B   688 B    +0%
split:dense                          31 ns   28 ns   -9%    328 B   328 B    +0%
split:sparse                         41 ns   43 ns   +4%    408 B   408 B    +0%
splitMember:dense                    33 ns   27 ns  -16%    336 B   336 B    +0%
splitMember:sparse                   47 ns   42 ns  -11%    416 B   416 B    +0%
union                               681 ns  663 ns   -2%    3.5 KB  3.5 KB   +0%
unions                              687 ns  677 ns   -1%    3.6 KB  3.6 KB   +0%

IntMap

Show
Name                                  Time - - - - - - - -    Allocated - - - - -
                                           A       B     %         A       B     %
alter                                 426 μs  426 μs   +0%    1.8 MB  1.8 MB   +0%
compare                                32 μs   32 μs   -1%     36 B    36 B    +0%
delete                                 96 μs   95 μs   -1%    768 KB  768 KB   +0%
eq                                     29 μs   30 μs   +1%     48 B    30 B   -37%
folds with key.foldMap_elem            14 μs   14 μs   +2%     37 B    45 B   +21%
folds with key.foldMap_traverseSum     18 μs   18 μs   +0%     64 KB   64 KB   +0%
folds with key.foldl'_sum              12 μs   12 μs   +1%     46 B    45 B    -2%
folds with key.foldl_cpsOneShotSum     37 μs   38 μs   +1%    320 KB  320 KB   +0%
folds with key.foldl_cpsSum            76 μs   77 μs   +0%    608 KB  608 KB   +0%
folds with key.foldl_elem              19 μs   20 μs   +4%    128 KB  128 KB   +0%
folds with key.foldl_traverseSum       67 μs   67 μs   +0%    480 KB  480 KB   +0%
folds with key.foldr'_sum              12 μs   12 μs   +2%     46 B    45 B    -2%
folds with key.foldr_cpsOneShotSum     37 μs   37 μs   +0%    320 KB  320 KB   +0%
folds with key.foldr_cpsSum            77 μs   78 μs   +1%    608 KB  608 KB   +0%
folds with key.foldr_elem              19 μs   20 μs   +2%    128 KB  128 KB   +0%
folds with key.foldr_traverseSum       67 μs   68 μs   +0%    480 KB  480 KB   +0%
folds.foldMap_elem                     16 μs   16 μs   -1%     37 B    37 B    +0%
folds.foldMap_traverseSum              18 μs   18 μs   -1%     64 KB   64 KB   +0%
folds.foldl'_sum                       10 μs   10 μs   +2%     42 B    42 B    +0%
folds.foldl_cpsOneShotSum              36 μs   36 μs   +0%    288 KB  288 KB   +0%
folds.foldl_cpsSum                     62 μs   61 μs   +0%    416 KB  416 KB   +0%
folds.foldl_elem                       18 μs   18 μs   +2%    128 KB  128 KB   +0%
folds.foldl_traverseSum                52 μs   52 μs   +0%    288 KB  288 KB   +0%
folds.foldr'_sum                       11 μs   10 μs   -6%     46 B    46 B    +0%
folds.foldr_cpsOneShotSum              36 μs   36 μs   +0%    288 KB  288 KB   +0%
folds.foldr_cpsSum                     62 μs   63 μs   +1%    416 KB  416 KB   +0%
folds.foldr_elem                       18 μs   19 μs   +1%    128 KB  128 KB   +0%
folds.foldr_traverseSum                52 μs   52 μs   +0%    288 KB  288 KB   +0%
fromAscList                            40 μs   39 μs   -1%    352 KB  352 KB   +0%
fromAscList:fusion                     31 μs   31 μs   -1%    352 KB  352 KB   +0%
fromList:asc                           99 μs   98 μs   -1%    864 KB  864 KB   +0%
fromList:asc:fusion                    88 μs   87 μs   -1%    864 KB  864 KB   +0%
fromList:random                       479 μs  473 μs   -1%    1.5 MB  1.5 MB   +0%
fromList:random:fusion                453 μs  450 μs   +0%    1.5 MB  1.5 MB   +0%
fromListWith:randomDups               317 μs  316 μs   +0%    1.3 MB  1.3 MB   +0%
fromListWith:randomDups:fusion        327 μs  324 μs   +0%    1.3 MB  1.3 MB   +0%
insert                                 98 μs   98 μs   +0%    864 KB  864 KB   +0%
insertLookupWithKey empty             529 μs  523 μs   -1%    3.7 MB  3.7 MB   +0%
insertLookupWithKey update            1.7 ms  1.7 ms   +0%    8.9 MB  8.9 MB   +0%
insertWith empty                      110 μs  110 μs   +0%    864 KB  864 KB   +0%
insertWith update                     458 μs  457 μs   +0%    1.9 MB  1.9 MB   +0%
insertWith' empty                     110 μs  111 μs   +0%    864 KB  864 KB   +0%
insertWith' update                    457 μs  447 μs   -2%    1.8 MB  1.8 MB   +0%
insertWithKey empty                   112 μs  111 μs   +0%    864 KB  864 KB   +0%
insertWithKey update                  457 μs  453 μs   +0%    1.9 MB  1.9 MB   +0%
insertWithKey' empty                  111 μs  110 μs   +0%    864 KB  864 KB   +0%
insertWithKey' update                 463 μs  443 μs   -4%    1.8 MB  1.8 MB   +0%
lookup_half                            97 μs   95 μs   -1%     94 B    98 B    +4%
lookup_hits                           153 μs  153 μs   +0%    155 B    96 B   -38%
lookup_misses                         156 μs  152 μs   -2%     94 B   148 B   +57%
lookup_mixed                           13 μs   14 μs   +3%     50 B    53 B    +6%
lookup_most                           143 μs  140 μs   -1%    148 B   148 B    +0%
map                                    29 μs   30 μs   +4%    320 KB  320 KB   +0%
mapMaybe                               57 μs   56 μs   -1%    256 KB  256 KB   +0%
mapMaybeWithKey                        57 μs   56 μs   -2%    256 KB  256 KB   +0%
mapWithKey                             35 μs   35 μs   -1%    384 KB  384 KB   +0%
minView                                43 ns   36 ns  -17%    104 B   104 B    +0%
restrictKeys                          792 ns  791 ns   +0%    4.2 KB  4.2 KB   +0%
restrictKeys:random                    34 μs   33 μs   -1%    6.3 KB  6.3 KB   +0%
spanAntitone                           87 ns   78 ns  -10%    664 B   664 B    +0%
split                                  41 ns   38 ns   -7%    408 B   408 B    +0%
splitLookup                            48 ns   41 ns  -14%    432 B   432 B    +0%
update                                421 μs  421 μs   +0%    1.7 MB  1.7 MB   +0%
updateLookupWithKey                   834 μs  831 μs   +0%    3.7 MB  3.7 MB   +0%
withoutKeys                           528 ns  524 ns   +0%     32 B    32 B    +0%
withoutKeys:random                     46 μs   46 μs   +0%    110 KB  110 KB   +0%

* Shorten "Left", "Right" in Intmap to L, R.
* binCheckL and binCheckR are used to skip Nil checks where the
  invariants guarantee that a tree is non-Nil.
* Benchmarks show minor improvements.
@meooow25 meooow25 merged commit 51ef2cf into haskell:master Apr 26, 2025
13 checks passed
@meooow25 meooow25 deleted the bincheck branch April 26, 2025 10:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant