updated readme
This commit is contained in:
parent
0bb8daca1a
commit
662843116e
2 changed files with 160 additions and 19 deletions
|
|
@ -107,6 +107,146 @@ var onlyInA = mapA.Except(mapB);
|
||||||
var symmetricDiff = mapA.SymmetricExcept(mapB);
|
var symmetricDiff = mapA.SymmetricExcept(mapB);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
** Benchmarks
|
||||||
|
This is going to be all over the place, but here is a small comparison to other immutable sequences. Due to how the prefix optimization works, this persistent map will be the absolutely most performant when there is high entropy in the first 8 bytes of the key. The following is pretty much the best scenario we can have since we probably only look at the first 8 characters (this is for reading a value).
|
||||||
|
|
||||||
|
#+begin_src
|
||||||
|
| Method | CollectionSize | KeySize | Mean | Error | StdDev | Median | Gen0 | Allocated |
|
||||||
|
|-----------------|----------------|----------|--------------:|-------------:|-------------:|--------------:|-----------:|----------:|
|
||||||
|
| PersistentMap | **1024** | **10** | **25.61 ns** | **0.479 ns** | **0.425 ns** | **25.56 ns** | **0.0043** | **72 B** |
|
||||||
|
| Sys.Sorted | 1024 | 10 | 153.18 ns | 1.605 ns | 1.423 ns | 153.14 ns | - | - |
|
||||||
|
| LangExt.HashMap | 1024 | 10 | 24.80 ns | 0.073 ns | 0.065 ns | 24.79 ns | - | - |
|
||||||
|
| LangExtSorted | 1024 | 10 | 176.90 ns | 1.196 ns | 1.061 ns | 176.48 ns | - | - |
|
||||||
|
| PersistentMap | **1024** | **100** | **26.43 ns** | **0.245 ns** | **0.217 ns** | **26.35 ns** | **0.0043** | **72 B** |
|
||||||
|
| SysSorted | 1024 | 100 | 154.77 ns | 1.977 ns | 1.849 ns | 153.74 ns | - | - |
|
||||||
|
| LangExt.HashMap | 1024 | 100 | 66.30 ns | 0.054 ns | 0.051 ns | 66.31 ns | - | - |
|
||||||
|
| LangExtSorted | 1024 | 100 | 177.28 ns | 1.516 ns | 1.344 ns | 177.14 ns | - | - |
|
||||||
|
| PersistentMap | **1024** | **1000** | **26.17 ns** | **0.480 ns** | **0.449 ns** | **26.07 ns** | **0.0043** | **72 B** |
|
||||||
|
| SysSorted | 1024 | 1000 | 155.68 ns | 1.229 ns | 1.090 ns | 155.26 ns | - | - |
|
||||||
|
| LangExt.HashMap | 1024 | 1000 | 491.97 ns | 0.927 ns | 0.774 ns | 492.14 ns | - | - |
|
||||||
|
| LangExtSorted | 1024 | 1000 | 181.58 ns | 1.030 ns | 0.913 ns | 181.54 ns | - | - |
|
||||||
|
| PersistentMap | **131072** | **10** | **109.34 ns** | **2.200 ns** | **5.795 ns** | **107.97 ns** | **0.0072** | **120 B** |
|
||||||
|
| SysSorted | 131072 | 10 | 460.22 ns | 9.101 ns | 12.457 ns | 453.61 ns | - | - |
|
||||||
|
| LangExt.HashMap | 131072 | 10 | 60.35 ns | 1.346 ns | 3.904 ns | 59.40 ns | - | - |
|
||||||
|
| LangExtSorted | 131072 | 10 | 555.17 ns | 15.764 ns | 46.233 ns | 539.79 ns | - | - |
|
||||||
|
| PersistentMap | **131072** | **100** | **147.30 ns** | **2.954 ns** | **8.283 ns** | **145.49 ns** | **0.0072** | **120 B** |
|
||||||
|
| SysSorted | 131072 | 100 | 556.39 ns | 13.929 ns | 41.070 ns | 544.95 ns | - | - |
|
||||||
|
| LangExt.HashMap | 131072 | 100 | 162.81 ns | 2.056 ns | 1.823 ns | 162.78 ns | - | - |
|
||||||
|
| LangExtSorted | 131072 | 100 | 605.15 ns | 12.352 ns | 35.040 ns | 595.60 ns | - | - |
|
||||||
|
| PersistentMap | **131072** | **1000** | **170.16 ns** | **3.417 ns** | **5.894 ns** | **170.33 ns** | **0.0072** | **120 B** |
|
||||||
|
| SysSorted | 131072 | 1000 | 625.78 ns | 12.406 ns | 33.541 ns | 618.61 ns | - | - |
|
||||||
|
| LangExt.HashMap | 131072 | 1000 | 763.75 ns | 14.928 ns | 26.919 ns | 763.61 ns | - | - |
|
||||||
|
| LangExtSorted | 131072 | 1000 | 692.92 ns | 21.200 ns | 62.177 ns | 673.69 ns | - | - |
|
||||||
|
|
||||||
|
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
To look at pure overhead, here is a benchmark using integers as keys. This is also a good fit for this BTree, since it can utilize a key strategy that compares integers using AVX. The hash based alternatives are going to have a huge advantage here. As you can see, reading a single value isn't great, and setting a single value after building the btree is also pretty awful (setting many should probably be done using transients). Iterating a building (using transients. The only valid comparison here is probably to MS SortedDict) is however plenty fast.
|
||||||
|
|
||||||
|
|
||||||
|
#+begin_src
|
||||||
|
| Method | N | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
|
||||||
|
|-------------------------------------|--------|-----------------:|-----------------:|---------------:|----------:|----------:|--------:|------------:|
|
||||||
|
| 'Build: PersistentMap (Transient)' | 100 | 3,764.63 ns | 335.100 ns | 18.368 ns | 0.3929 | 0.0038 | - | 6632 B |
|
||||||
|
| 'Build: MS Sorted (Builder)' | 100 | 3,096.11 ns | 361.221 ns | 19.800 ns | 0.2899 | 0.0038 | - | 4864 B |
|
||||||
|
| 'Build: LanguageExt Map (AVL)' | 100 | 6,967.02 ns | 1,549.676 ns | 84.943 ns | 2.2736 | 0.0229 | - | 38144 B |
|
||||||
|
| 'Build: LanguageExt HashMap' | 100 | 4,594.07 ns | 1,650.289 ns | 90.458 ns | 1.9684 | 0.0076 | - | 33024 B |
|
||||||
|
| 'Read: PersistentMap' | 100 | 1,596.68 ns | 941.760 ns | 51.621 ns | 0.4292 | - | - | 7200 B |
|
||||||
|
| 'Read: MS Sorted' | 100 | 474.54 ns | 399.684 ns | 21.908 ns | - | - | - | - |
|
||||||
|
| 'Read: LanguageExt Map' | 100 | 1,311.31 ns | 396.858 ns | 21.753 ns | - | - | - | - |
|
||||||
|
| 'Read: LanguageExt HashMap' | 100 | 641.22 ns | 4.436 ns | 0.243 ns | - | - | - | - |
|
||||||
|
| 'Iterate: PersistentMap' | 100 | 135.41 ns | 5.953 ns | 0.326 ns | - | - | - | - |
|
||||||
|
| 'Iterate: MS Sorted' | 100 | 372.31 ns | 15.959 ns | 0.875 ns | - | - | - | - |
|
||||||
|
| 'Iterate: LanguageExt Map' | 100 | 287.33 ns | 89.684 ns | 4.916 ns | 0.0019 | - | - | 32 B |
|
||||||
|
| 'Iterate: LanguageExt HashMap' | 100 | 781.56 ns | 40.469 ns | 2.218 ns | 0.0648 | - | - | 1088 B |
|
||||||
|
| 'Set: PersistentMap' | 100 | 85.68 ns | 25.237 ns | 1.383 ns | 0.1142 | 0.0007 | - | 1912 B |
|
||||||
|
| 'Set: MS Sorted' | 100 | 66.44 ns | 5.990 ns | 0.328 ns | 0.0229 | - | - | 384 B |
|
||||||
|
| 'Set: LanguageExt Map' | 100 | 60.04 ns | 27.661 ns | 1.516 ns | 0.0219 | - | - | 368 B |
|
||||||
|
| 'Set: LanguageExt HashMap' | 100 | 36.62 ns | 3.649 ns | 0.200 ns | 0.0206 | - | - | 344 B |
|
||||||
|
| 'Build: PersistentMap (Transient)' | 1000 | 49,445.56 ns | 8,020.473 ns | 439.629 ns | 3.1738 | 0.2441 | - | 53096 B |
|
||||||
|
| 'Build: MS Sorted (Builder)' | 1000 | 50,163.19 ns | 2,022.398 ns | 110.854 ns | 2.8687 | 0.4272 | - | 48064 B |
|
||||||
|
| 'Build: LanguageExt Map (AVL)' | 1000 | 103,877.98 ns | 10,669.198 ns | 584.815 ns | 34.6680 | 3.1738 | - | 580688 B |
|
||||||
|
| 'Build: LanguageExt HashMap' | 1000 | 124,339.17 ns | 27,843.925 ns | 1,526.219 ns | 45.4102 | 3.2959 | - | 760096 B |
|
||||||
|
| 'Read: PersistentMap' | 1000 | 17,671.71 ns | 16,074.235 ns | 881.083 ns | 4.3030 | - | - | 72000 B |
|
||||||
|
| 'Read: MS Sorted' | 1000 | 7,911.72 ns | 6,398.764 ns | 350.738 ns | - | - | - | - |
|
||||||
|
| 'Read: LanguageExt Map' | 1000 | 20,187.52 ns | 2,218.583 ns | 121.608 ns | - | - | - | - |
|
||||||
|
| 'Read: LanguageExt HashMap' | 1000 | 9,740.28 ns | 590.689 ns | 32.378 ns | - | - | - | - |
|
||||||
|
| 'Iterate: PersistentMap' | 1000 | 1,217.47 ns | 41.521 ns | 2.276 ns | - | - | - | - |
|
||||||
|
| 'Iterate: MS Sorted' | 1000 | 3,875.47 ns | 243.628 ns | 13.354 ns | - | - | - | - |
|
||||||
|
| 'Iterate: LanguageExt Map' | 1000 | 2,862.82 ns | 259.120 ns | 14.203 ns | - | - | - | 32 B |
|
||||||
|
| 'Iterate: LanguageExt HashMap' | 1000 | 11,974.93 ns | 2,791.930 ns | 153.035 ns | 1.9226 | - | - | 32320 B |
|
||||||
|
| 'Set: PersistentMap' | 1000 | 121.01 ns | 71.460 ns | 3.917 ns | 0.1142 | 0.0007 | - | 1912 B |
|
||||||
|
| 'Set: MS Sorted' | 1000 | 91.62 ns | 18.682 ns | 1.024 ns | 0.0315 | - | - | 528 B |
|
||||||
|
| 'Set: LanguageExt Map' | 1000 | 82.26 ns | 14.918 ns | 0.818 ns | 0.0305 | - | - | 512 B |
|
||||||
|
| 'Set: LanguageExt HashMap' | 1000 | 57.02 ns | 5.549 ns | 0.304 ns | 0.0367 | - | - | 616 B |
|
||||||
|
| 'Build: PersistentMap (Transient)' | 100000 | 10,808,233.62 ns | 745,888.473 ns | 40,884.664 ns | 296.8750 | 218.7500 | - | 5185832 B |
|
||||||
|
| 'Build: MS Sorted (Builder)' | 100000 | 16,655,882.43 ns | 273,417.248 ns | 14,986.922 ns | 281.2500 | 250.0000 | - | 4800064 B |
|
||||||
|
| 'Build: LanguageExt Map (AVL)' | 100000 | 39,932,734.83 ns | 8,226,697.957 ns | 450,933.077 ns | 5333.3333 | 3333.3333 | - | 89959040 B |
|
||||||
|
| 'Build: LanguageExt HashMap' | 100000 | 21,220,179.10 ns | 4,851,159.671 ns | 265,908.432 ns | 5781.2500 | 2968.7500 | 31.2500 | 96555422 B |
|
||||||
|
| 'Read: PersistentMap' | 100000 | 7,359,807.97 ns | 593,641.656 ns | 32,539.502 ns | 710.9375 | - | - | 12000000 B |
|
||||||
|
| 'Read: MS Sorted' | 100000 | 8,428,009.48 ns | 2,943,716.723 ns | 161,355.047 ns | - | - | - | - |
|
||||||
|
| 'Read: LanguageExt Map' | 100000 | 10,268,884.43 ns | 1,035,387.251 ns | 56,753.069 ns | - | - | - | - |
|
||||||
|
| 'Read: LanguageExt HashMap' | 100000 | 1,936,555.07 ns | 19,847.031 ns | 1,087.883 ns | - | - | - | - |
|
||||||
|
| 'Iterate: PersistentMap' | 100000 | 151,028.79 ns | 4,471.641 ns | 245.106 ns | - | - | - | - |
|
||||||
|
| 'Iterate: MS Sorted' | 100000 | 1,068,072.16 ns | 24,123.759 ns | 1,322.305 ns | - | - | - | - |
|
||||||
|
| 'Iterate: LanguageExt Map' | 100000 | 837,677.39 ns | 10,559.659 ns | 578.811 ns | - | - | - | 32 B |
|
||||||
|
| 'Iterate: LanguageExt HashMap' | 100000 | 1,226,773.82 ns | 87,367.624 ns | 4,788.914 ns | 64.4531 | - | - | 1082432 B |
|
||||||
|
| 'Set: PersistentMap' | 100000 | 208.61 ns | 225.596 ns | 12.366 ns | 0.1984 | 0.0024 | - | 3320 B |
|
||||||
|
| 'Set: MS Sorted' | 100000 | 138.82 ns | 18.977 ns | 1.040 ns | 0.0458 | - | - | 768 B |
|
||||||
|
| 'Set: LanguageExt Map' | 100000 | 128.28 ns | 47.447 ns | 2.601 ns | 0.0448 | - | - | 752 B |
|
||||||
|
| 'Set: LanguageExt HashMap' | 100000 | 84.33 ns | 7.125 ns | 0.391 ns | 0.0583 | - | - | 976 B |
|
||||||
|
|
||||||
|
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
Lastly, here is a comparison of how things look compared to itself for when the prefixes are turned off for strings. This relies on regular linear string searches. This is however STILL a pretty good benchmark for all ordered dicts, since the strings are random, meaning the string comparison can stop almost immediately. For real world keys, all hash based dicts will be better, with everything regarding getting or setting a single key.
|
||||||
|
|
||||||
|
|
||||||
|
#+begin_src
|
||||||
|
| Method | N | KeyLength | Mean | Error | StdDev | Gen0 | Gen1 | Allocated |
|
||||||
|
|--------------------------- |------ |---------- |----------------:|-----------------:|--------------:|---------:|---------:|----------:|
|
||||||
|
| 'Build: NiceBTree' | 10000 | 10 | 2,037,851.45 ns | 60,065.478 ns | 3,292.392 ns | 35.1563 | 15.6250 | 644600 B |
|
||||||
|
| 'Build: MS HashDict' | 10000 | 10 | 1,647,876.61 ns | 105,992.785 ns | 5,809.822 ns | 37.1094 | 15.6250 | 640096 B |
|
||||||
|
| 'Build: MS SortedDict' | 10000 | 10 | 3,853,709.48 ns | 606,862.929 ns | 33,264.205 ns | 31.2500 | 11.7188 | 560112 B |
|
||||||
|
| 'Build: LangExt HashMap' | 10000 | 10 | 1,612,117.07 ns | 313,091.665 ns | 17,161.611 ns | 472.6563 | 154.2969 | 7919328 B |
|
||||||
|
| 'Build: LangExt Map' | 10000 | 10 | 5,363,298.26 ns | 582,836.469 ns | 31,947.234 ns | 507.8125 | 203.1250 | 8594784 B |
|
||||||
|
| 'Read: NiceBTree' | 10000 | 10 | 36.30 ns | 0.918 ns | 0.050 ns | - | - | - |
|
||||||
|
| 'Read: MS HashDict' | 10000 | 10 | 12.66 ns | 0.431 ns | 0.024 ns | - | - | - |
|
||||||
|
| 'Read: MS SortedDict' | 10000 | 10 | 233.59 ns | 26.034 ns | 1.427 ns | - | - | - |
|
||||||
|
| 'Read: LangExt HashMap' | 10000 | 10 | 28.61 ns | 0.254 ns | 0.014 ns | - | - | - |
|
||||||
|
| 'Read: LangExt Map' | 10000 | 10 | 268.13 ns | 3.301 ns | 0.181 ns | - | - | - |
|
||||||
|
| 'Iterate: NiceBTree' | 10000 | 10 | 12,630.95 ns | 759.122 ns | 41.610 ns | - | - | - |
|
||||||
|
| 'Iterate: MS HashDict' | 10000 | 10 | 151,314.44 ns | 22,323.733 ns | 1,223.639 ns | - | - | - |
|
||||||
|
| 'Iterate: MS SortedDict' | 10000 | 10 | 57,402.20 ns | 1,498.945 ns | 82.162 ns | - | - | - |
|
||||||
|
| 'Iterate: LangExt HashMap' | 10000 | 10 | 148,980.47 ns | 21,649.428 ns | 1,186.678 ns | 10.0098 | - | 170712 B |
|
||||||
|
| 'Iterate: LangExt Map' | 10000 | 10 | 34,428.07 ns | 5,647.779 ns | 309.574 ns | - | - | 32 B |
|
||||||
|
| 'Update: NiceBTree' | 10000 | 10 | 303.01 ns | 107.216 ns | 5.877 ns | 0.2027 | 0.0024 | 3392 B |
|
||||||
|
| 'Update: MS HashDict' | 10000 | 10 | 48.36 ns | 1.275 ns | 0.070 ns | 0.0100 | - | 168 B |
|
||||||
|
| 'Update: MS SortedDict' | 10000 | 10 | 137.47 ns | 33.015 ns | 1.810 ns | 0.0196 | - | 328 B |
|
||||||
|
| 'Update: LangExt HashMap' | 10000 | 10 | 102.57 ns | 7.196 ns | 0.394 ns | 0.0502 | 0.0001 | 840 B |
|
||||||
|
| 'Update: LangExt Map' | 10000 | 10 | 122.54 ns | 8.691 ns | 0.476 ns | 0.0186 | - | 312 B |
|
||||||
|
| 'Build: NiceBTree' | 10000 | 50 | 2,020,984.87 ns | 91,788.936 ns | 5,031.261 ns | 35.1563 | 11.7188 | 624248 B |
|
||||||
|
| 'Build: MS HashDict' | 10000 | 50 | 1,811,186.24 ns | 23,842.593 ns | 1,306.893 ns | 37.1094 | 15.6250 | 640096 B |
|
||||||
|
| 'Build: MS SortedDict' | 10000 | 50 | 3,883,214.25 ns | 198,364.955 ns | 10,873.053 ns | 31.2500 | 15.6250 | 560112 B |
|
||||||
|
| 'Build: LangExt HashMap' | 10000 | 50 | 1,784,616.64 ns | 248,685.113 ns | 13,631.270 ns | 472.6563 | 154.2969 | 7926712 B |
|
||||||
|
| 'Build: LangExt Map' | 10000 | 50 | 5,248,030.22 ns | 1,486,577.018 ns | 81,484.303 ns | 507.8125 | 203.1250 | 8544720 B |
|
||||||
|
| 'Read: NiceBTree' | 10000 | 50 | 40.64 ns | 0.574 ns | 0.031 ns | - | - | - |
|
||||||
|
| 'Read: MS HashDict' | 10000 | 50 | 29.91 ns | 2.182 ns | 0.120 ns | - | - | - |
|
||||||
|
| 'Read: MS SortedDict' | 10000 | 50 | 255.55 ns | 4.315 ns | 0.237 ns | - | - | - |
|
||||||
|
| 'Read: LangExt HashMap' | 10000 | 50 | 47.61 ns | 4.373 ns | 0.240 ns | - | - | - |
|
||||||
|
| 'Read: LangExt Map' | 10000 | 50 | 255.68 ns | 8.932 ns | 0.490 ns | - | - | - |
|
||||||
|
| 'Iterate: NiceBTree' | 10000 | 50 | 12,718.71 ns | 1,727.345 ns | 94.682 ns | - | - | - |
|
||||||
|
| 'Iterate: MS HashDict' | 10000 | 50 | 170,815.59 ns | 70,087.036 ns | 3,841.707 ns | - | - | - |
|
||||||
|
| 'Iterate: MS SortedDict' | 10000 | 50 | 68,982.58 ns | 9,267.855 ns | 508.002 ns | - | - | - |
|
||||||
|
| 'Iterate: LangExt HashMap' | 10000 | 50 | 144,442.27 ns | 96,636.820 ns | 5,296.990 ns | 9.7656 | - | 165600 B |
|
||||||
|
| 'Iterate: LangExt Map' | 10000 | 50 | 35,082.49 ns | 8,851.428 ns | 485.177 ns | - | - | 32 B |
|
||||||
|
| 'Update: NiceBTree' | 10000 | 50 |yy 393.56 ns | 101.149 ns | 5.544 ns | 0.2027 | 0.0024 | 3392 B |
|
||||||
|
| 'Update: MS HashDict' | 10000 | 50 | 114.57 ns | 17.939 ns | 0.983 ns | 0.0215 | - | 360 B |
|
||||||
|
| 'Update: MS SortedDict' | 10000 | 50 | 65.51 ns | 0.969 ns | 0.053 ns | 0.0129 | - | 216 B |
|
||||||
|
| 'Update: LangExt HashMap' | 10000 | 50 | 103.28 ns | 11.740 ns | 0.644 ns | 0.0535 | - | 896 B |
|
||||||
|
| 'Update: LangExt Map' | 10000 | 50 | 67.62 ns | 2.649 ns | 0.145 ns | 0.0119 | - | 200 B |
|
||||||
|
|
||||||
|
#+end_src
|
||||||
** Architecture Notes: Key Strategies
|
** Architecture Notes: Key Strategies
|
||||||
NiceBtree uses =IKeyStrategy<K>= to map generic keys (like =string= or =double=) into sortable =long= prefixes. This achieves two things:
|
NiceBtree uses =IKeyStrategy<K>= to map generic keys (like =string= or =double=) into sortable =long= prefixes. This achieves two things:
|
||||||
1. Enables AVX512/AVX2 vector instructions to search internal nodes simultaneously.
|
1. Enables AVX512/AVX2 vector instructions to search internal nodes simultaneously.
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ public class ImmutableCollectionBenchmarks
|
||||||
// the cost of pure immutable inserts vs your Transient/Builder.
|
// the cost of pure immutable inserts vs your Transient/Builder.
|
||||||
// =========================================================
|
// =========================================================
|
||||||
|
|
||||||
[Benchmark(Description = "Build: NiceBTree (Transient)")]
|
[Benchmark(Description = "Build: PersistentMap (Transient)")]
|
||||||
public int Build_NiceBTree()
|
public int Build_NiceBTree()
|
||||||
{
|
{
|
||||||
var t = BaseOrderedMap<int, int, IntStrategy>.CreateTransient(_strategy);
|
var t = BaseOrderedMap<int, int, IntStrategy>.CreateTransient(_strategy);
|
||||||
|
|
@ -72,6 +72,14 @@ public class ImmutableCollectionBenchmarks
|
||||||
return t.Count;
|
return t.Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Benchmark(Description = "Build: PersistentMap (Persistent)")]
|
||||||
|
public int Build_PersistentBTree()
|
||||||
|
{
|
||||||
|
var t = PersistentMap<int, int, IntStrategy>.Empty(_strategy);
|
||||||
|
for (int i = 0; i < N; i++) t.Set(_keys[i], _values[i]);
|
||||||
|
return t.Count;
|
||||||
|
}
|
||||||
|
|
||||||
[Benchmark(Description = "Build: MS Sorted (Builder)")]
|
[Benchmark(Description = "Build: MS Sorted (Builder)")]
|
||||||
public int Build_MsSorted()
|
public int Build_MsSorted()
|
||||||
{
|
{
|
||||||
|
|
@ -110,11 +118,9 @@ public class ImmutableCollectionBenchmarks
|
||||||
[Benchmark(Description = "Read: NiceBTree")]
|
[Benchmark(Description = "Read: NiceBTree")]
|
||||||
public int Read_NiceBTree()
|
public int Read_NiceBTree()
|
||||||
{
|
{
|
||||||
int found = 0;
|
var found = 1;
|
||||||
for (int i = 0; i < N; i++)
|
if (_niceMap.TryGetValue(_keys[N/2], out _)) found++;
|
||||||
{
|
|
||||||
if (_niceMap.TryGetValue(_keys[i], out _)) found++;
|
|
||||||
}
|
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -122,10 +128,8 @@ public class ImmutableCollectionBenchmarks
|
||||||
public int Read_MsSorted()
|
public int Read_MsSorted()
|
||||||
{
|
{
|
||||||
int found = 0;
|
int found = 0;
|
||||||
for (int i = 0; i < N; i++)
|
if (_msSortedMap.ContainsKey(_keys[N/2])) found++;
|
||||||
{
|
|
||||||
if (_msSortedMap.ContainsKey(_keys[i])) found++;
|
|
||||||
}
|
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -133,11 +137,9 @@ public class ImmutableCollectionBenchmarks
|
||||||
public int Read_LanguageExt_Map()
|
public int Read_LanguageExt_Map()
|
||||||
{
|
{
|
||||||
int found = 0;
|
int found = 0;
|
||||||
for (int i = 0; i < N; i++)
|
|
||||||
{
|
|
||||||
// Find returns Option<V>, IsSome checks if it exists
|
// Find returns Option<V>, IsSome checks if it exists
|
||||||
if (_leMap.Find(_keys[i]).IsSome) found++;
|
if (_leMap.Find(_keys[N/2]).IsSome) found++;
|
||||||
}
|
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -145,10 +147,9 @@ public class ImmutableCollectionBenchmarks
|
||||||
public int Read_LanguageExt_HashMap()
|
public int Read_LanguageExt_HashMap()
|
||||||
{
|
{
|
||||||
int found = 0;
|
int found = 0;
|
||||||
for (int i = 0; i < N; i++)
|
|
||||||
{
|
if (_leHashMap.Find(_keys[N/2]).IsSome) found++;
|
||||||
if (_leHashMap.Find(_keys[i]).IsSome) found++;
|
|
||||||
}
|
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -216,4 +217,4 @@ public class ImmutableCollectionBenchmarks
|
||||||
{
|
{
|
||||||
return _leHashMap.SetItem(_keys[N / 2], -1);
|
return _leHashMap.SetItem(_keys[N / 2], -1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue