Move to new hash structure for even more performance
This is an attempt to see the effect on performance if we remove nodes and bring the values up to avoid recursion for the entry node taking some inspiration from CHAMP but with a more .NET flavor taking advantage of some of F#'s features on top.
Current benchmarks below. For smaller collections below 1,000,000 significantly faster in many cases. As per comments this makes us the fastest in all cases across every collection in the .NET ecosystem I could find for the general lookup case. The very big collections grow slightly but not as much of a concern % wise. This is especially true around the 500,000 to 1,000,000 range.
Seeing 3.8GB go down to 2.1GB in memory consumption using a quick FSX script storing 30,000,000 elements with a HashMap<int, string> (string being converted from the int key) entry. So it is more memory efficient as well.
BenchmarkDotNet=v0.13.1, OS=arch
AMD Ryzen 7 3700X, 1 CPU, 16 logical and 8 physical cores
.NET SDK=6.0.110
[Host] : .NET 6.0.10 (6.0.1022.51301), X64 RyuJIT DEBUG
DefaultJob : .NET 6.0.10 (6.0.1022.51301), X64 RyuJIT
| Method | CollectionSize | Mean | Error | StdDev |
|---|---|---|---|---|
| GetHashMapCurrent | 10 | 11.29 ns | 0.092 ns | 0.086 ns |
| GetHashMapNew | 10 | 10.65 ns | 0.058 ns | 0.054 ns |
| GetHashMapCurrent | 100 | 16.69 ns | 0.135 ns | 0.126 ns |
| GetHashMapNew | 100 | 11.05 ns | 0.066 ns | 0.062 ns |
| GetHashMapCurrent | 1000 | 12.53 ns | 0.120 ns | 0.101 ns |
| GetHashMapNew | 1000 | 11.07 ns | 0.071 ns | 0.066 ns |
| GetHashMapCurrent | 100000 | 27.60 ns | 0.239 ns | 0.223 ns |
| GetHashMapNew | 100000 | 30.42 ns | 0.274 ns | 0.257 ns |
| GetHashMapCurrent | 500000 | 75.84 ns | 0.737 ns | 0.689 ns |
| GetHashMapNew | 500000 | 32.58 ns | 0.302 ns | 0.282 ns |
| GetHashMapCurrent | 750000 | 108.36 ns | 0.605 ns | 0.506 ns |
| GetHashMapNew | 750000 | 35.01 ns | 0.387 ns | 0.343 ns |
| GetHashMapCurrent | 1000000 | 115.40 ns | 0.202 ns | 0.169 ns |
| GetHashMapNew | 1000000 | 38.45 ns | 0.111 ns | 0.086 ns |
| GetHashMapCurrent | 5000000 | 144.12 ns | 0.331 ns | 0.294 ns |
| GetHashMapNew | 5000000 | 176.51 ns | 0.731 ns | 0.684 ns |
| GetHashMapCurrent | 10000000 | 163.24 ns | 0.788 ns | 0.737 ns |
| GetHashMapNew | 10000000 | 178.63 ns | 0.561 ns | 0.524 ns |
Update now. Very significant improvement in performance.
BenchmarkDotNet=v0.13.1, OS=arch
AMD Ryzen 7 3700X, 1 CPU, 16 logical and 8 physical cores
.NET SDK=6.0.110
[Host] : .NET 6.0.10 (6.0.1022.51301), X64 RyuJIT DEBUG
DefaultJob : .NET 6.0.10 (6.0.1022.51301), X64 RyuJIT
| Method | CollectionSize | Mean | Error | StdDev |
|---|---|---|---|---|
| GetHashMap | 10 | 10.65 ns | 0.058 ns | 0.054 ns |
| GetImToolsHashMap | 10 | 30.91 ns | 0.454 ns | 0.402 ns |
| GetFSharpMap | 10 | 25.66 ns | 0.307 ns | 0.272 ns |
| GetFSharpXHashMap | 10 | 114.06 ns | 0.515 ns | 0.430 ns |
| GetSystemCollectionsImmutableMap | 10 | 20.48 ns | 0.156 ns | 0.146 ns |
| GetFSharpDataAdaptiveMap | 10 | 22.38 ns | 0.285 ns | 0.267 ns |
| GetFSharpxChampMap | 10 | 69.43 ns | 0.992 ns | 0.829 ns |
| GetLangExtMap | 10 | 25.62 ns | 0.254 ns | 0.238 ns |
| GetHashMap | 100 | 11.05 ns | 0.066 ns | 0.062 ns |
| GetImToolsHashMap | 100 | 45.45 ns | 0.905 ns | 1.268 ns |
| GetFSharpMap | 100 | 44.86 ns | 0.643 ns | 0.602 ns |
| GetFSharpXHashMap | 100 | 130.77 ns | 1.577 ns | 1.475 ns |
| GetSystemCollectionsImmutableMap | 100 | 33.37 ns | 0.368 ns | 0.344 ns |
| GetFSharpDataAdaptiveMap | 100 | 43.50 ns | 0.371 ns | 0.347 ns |
| GetFSharpxChampMap | 100 | 76.28 ns | 0.710 ns | 0.664 ns |
| GetLangExtMap | 100 | 32.07 ns | 0.574 ns | 0.509 ns |
| GetHashMap | 1000 | 11.07 ns | 0.071 ns | 0.066 ns |
| GetImToolsHashMap | 1000 | 67.18 ns | 0.518 ns | 0.433 ns |
| GetFSharpMap | 1000 | 68.09 ns | 0.532 ns | 0.472 ns |
| GetFSharpXHashMap | 1000 | 130.43 ns | 1.562 ns | 1.462 ns |
| GetSystemCollectionsImmutableMap | 1000 | 49.63 ns | 0.482 ns | 0.451 ns |
| GetFSharpDataAdaptiveMap | 1000 | 67.25 ns | 0.771 ns | 0.721 ns |
| GetFSharpxChampMap | 1000 | 78.76 ns | 0.541 ns | 0.506 ns |
| GetLangExtMap | 1000 | 31.63 ns | 0.515 ns | 0.482 ns |
| GetHashMap | 100000 | 30.42 ns | 0.274 ns | 0.257 ns |
| GetImToolsHashMap | 100000 | 193.13 ns | 2.036 ns | 1.700 ns |
| GetFSharpMap | 100000 | 169.61 ns | 3.329 ns | 3.270 ns |
| GetFSharpXHashMap | 100000 | 168.93 ns | 1.366 ns | 1.278 ns |
| GetSystemCollectionsImmutableMap | 100000 | 140.59 ns | 1.425 ns | 1.333 ns |
| GetFSharpDataAdaptiveMap | 100000 | 139.36 ns | 1.595 ns | 1.492 ns |
| GetFSharpxChampMap | 100000 | 99.80 ns | 0.634 ns | 0.593 ns |
| GetLangExtMap | 100000 | 57.49 ns | 0.453 ns | 0.424 ns |
| GetHashMap | 500000 | 32.58 ns | 0.302 ns | 0.282 ns |
| GetImToolsHashMap | 500000 | 504.27 ns | 5.921 ns | 4.945 ns |
| GetFSharpMap | 500000 | 298.44 ns | 1.936 ns | 1.716 ns |
| GetFSharpXHashMap | 500000 | 248.86 ns | 2.486 ns | 2.204 ns |
| GetSystemCollectionsImmutableMap | 500000 | 320.58 ns | 2.238 ns | 1.984 ns |
| GetFSharpDataAdaptiveMap | 500000 | 294.53 ns | 4.647 ns | 4.347 ns |
| GetFSharpxChampMap | 500000 | 105.43 ns | 0.987 ns | 0.924 ns |
| GetLangExtMap | 500000 | 60.19 ns | 0.662 ns | 0.619 ns |
| GetHashMap | 750000 | 35.01 ns | 0.387 ns | 0.343 ns |
| GetImToolsHashMap | 750000 | 609.94 ns | 3.531 ns | 3.303 ns |
| GetFSharpMap | 750000 | 399.68 ns | 3.269 ns | 2.730 ns |
| GetFSharpXHashMap | 750000 | 363.80 ns | 2.317 ns | 2.168 ns |
| GetSystemCollectionsImmutableMap | 750000 | 406.24 ns | 2.870 ns | 2.684 ns |
| GetFSharpDataAdaptiveMap | 750000 | 353.14 ns | 1.591 ns | 1.488 ns |
| GetFSharpxChampMap | 750000 | 109.05 ns | 0.757 ns | 0.708 ns |
| GetLangExtMap | 750000 | 62.80 ns | 0.538 ns | 0.503 ns |
| GetHashMap | 1000000 | 38.45 ns | 0.111 ns | 0.086 ns |
| GetImToolsHashMap | 1000000 | 677.05 ns | 4.182 ns | 3.707 ns |
| GetFSharpMap | 1000000 | 453.00 ns | 2.725 ns | 2.276 ns |
| GetFSharpXHashMap | 1000000 | 353.86 ns | 1.709 ns | 1.515 ns |
| GetSystemCollectionsImmutableMap | 1000000 | 462.96 ns | 2.829 ns | 2.508 ns |
| GetFSharpDataAdaptiveMap | 1000000 | 385.43 ns | 2.308 ns | 2.046 ns |
| GetFSharpxChampMap | 1000000 | 114.60 ns | 0.997 ns | 0.932 ns |
| GetLangExtMap | 1000000 | 67.77 ns | 0.728 ns | 0.681 ns |
| GetHashMap | 5000000 | 176.51 ns | 0.731 ns | 0.684 ns |
| GetImToolsHashMap | 5000000 | 1,094.67 ns | 7.069 ns | 6.613 ns |
| GetFSharpMap | 5000000 | 799.41 ns | 4.937 ns | 4.618 ns |
| GetFSharpXHashMap | 5000000 | 383.52 ns | 4.527 ns | 4.013 ns |
| GetSystemCollectionsImmutableMap | 5000000 | 779.07 ns | 1.280 ns | 0.999 ns |
| GetFSharpDataAdaptiveMap | 5000000 | 560.13 ns | 2.956 ns | 2.765 ns |
| GetFSharpxChampMap | 5000000 | 263.49 ns | 1.697 ns | 1.588 ns |
| GetLangExtMap | 5000000 | 218.87 ns | 0.743 ns | 0.659 ns |
| GetHashMap | 10000000 | 178.63 ns | 0.561 ns | 0.524 ns |
| GetImToolsHashMap | 10000000 | 1,318.09 ns | 3.118 ns | 2.604 ns |
| GetFSharpMap | 10000000 | 922.89 ns | 4.792 ns | 4.248 ns |
| GetFSharpXHashMap | 10000000 | 417.95 ns | 2.366 ns | 2.098 ns |
| GetSystemCollectionsImmutableMap | 10000000 | 916.40 ns | 4.419 ns | 4.133 ns |
| GetFSharpDataAdaptiveMap | 10000000 | 654.89 ns | 2.616 ns | 2.447 ns |
| GetFSharpxChampMap | 10000000 | 265.47 ns | 1.223 ns | 1.084 ns |
| GetLangExtMap | 10000000 | 225.11 ns | 1.660 ns | 1.472 ns |
BenchmarkDotNet=v0.13.1, OS=arch
AMD Ryzen 7 3700X, 1 CPU, 16 logical and 8 physical cores
.NET SDK=6.0.110
[Host] : .NET 6.0.10 (6.0.1022.51301), X64 RyuJIT DEBUG
DefaultJob : .NET 6.0.10 (6.0.1022.51301), X64 RyuJIT
``` ini
BenchmarkDotNet=v0.13.1, OS=arch
AMD Ryzen 7 3700X, 1 CPU, 16 logical and 8 physical cores
.NET SDK=6.0.110
[Host] : .NET 6.0.10 (6.0.1022.51301), X64 RyuJIT DEBUG
DefaultJob : .NET 6.0.10 (6.0.1022.51301), X64 RyuJIT
| Method | CollectionSize | Mean | Error | StdDev |
|---|---|---|---|---|
| OfSeqHashMap | 1000 | 121.97 μs | 0.614 μs | 0.574 μs |
| OfSeqFSharpXMap | 1000 | 343.78 μs | 2.859 μs | 2.675 μs |
| OfSeqFSharpAdaptiveMap | 1000 | 81.86 μs | 0.552 μs | 0.516 μs |
| OfSeqSystemCollectionsImmutableMap | 1000 | 267.02 μs | 4.522 μs | 4.644 μs |
| OfSeqFSharpxChampMap | 1000 | 284.85 μs | 2.668 μs | 2.495 μs |
| OfSeqLangExtMap | 1000 | 221.13 μs | 3.120 μs | 2.919 μs |
| OfSeqHashMap | 100000 | 16,228.39 μs | 99.416 μs | 92.994 μs |
| OfSeqFSharpXMap | 100000 | 38,085.55 μs | 457.958 μs | 428.374 μs |
| OfSeqFSharpAdaptiveMap | 100000 | 10,763.06 μs | 72.472 μs | 67.791 μs |
| OfSeqSystemCollectionsImmutableMap | 100000 | 38,927.88 μs | 586.468 μs | 548.582 μs |
| OfSeqFSharpxChampMap | 100000 | 37,050.22 μs | 423.518 μs | 396.159 μs |
| OfSeqLangExtMap | 100000 | 35,622.50 μs | 460.803 μs | 431.036 μs |
| OfSeqHashMap | 500000 | 94,694.26 μs | 614.267 μs | 544.532 μs |
| OfSeqFSharpXMap | 500000 | 292,748.04 μs | 4,809.470 μs | 4,938.971 μs |
| OfSeqFSharpAdaptiveMap | 500000 | 57,806.85 μs | 612.561 μs | 543.020 μs |
| OfSeqSystemCollectionsImmutableMap | 500000 | 226,669.15 μs | 1,919.576 μs | 1,795.573 μs |
| OfSeqFSharpxChampMap | 500000 | 175,277.99 μs | 1,377.100 μs | 1,288.140 μs |
| OfSeqLangExtMap | 500000 | 214,164.05 μs | 1,489.650 μs | 1,393.419 μs |
| OfSeqHashMap | 750000 | 160,456.32 μs | 1,396.918 μs | 1,306.678 μs |
| OfSeqFSharpXMap | 750000 | 444,106.05 μs | 5,207.202 μs | 4,616.049 μs |
| OfSeqFSharpAdaptiveMap | 750000 | 89,562.63 μs | 771.520 μs | 721.680 μs |
| OfSeqSystemCollectionsImmutableMap | 750000 | 342,106.94 μs | 3,195.628 μs | 2,832.841 μs |
| OfSeqFSharpxChampMap | 750000 | 303,354.05 μs | 2,202.644 μs | 1,952.587 μs |
| OfSeqLangExtMap | 750000 | 346,468.87 μs | 1,241.252 μs | 1,100.337 μs |
| OfSeqHashMap | 1000000 | 234,958.69 μs | 2,318.191 μs | 2,168.437 μs |
| OfSeqFSharpXMap | 1000000 | 569,479.52 μs | 5,954.585 μs | 5,569.922 μs |
| OfSeqFSharpAdaptiveMap | 1000000 | 116,426.69 μs | 2,073.437 μs | 1,939.494 μs |
| OfSeqSystemCollectionsImmutableMap | 1000000 | 463,750.96 μs | 7,245.690 μs | 6,777.623 μs |
| OfSeqFSharpxChampMap | 1000000 | 445,312.46 μs | 3,483.774 μs | 3,258.724 μs |
| OfSeqLangExtMap | 1000000 | 506,889.88 μs | 3,897.241 μs | 3,454.803 μs |
| OfSeqHashMap | 5000000 | 1,804,469.03 μs | 14,262.758 μs | 13,341.393 μs |
| OfSeqFSharpXMap | 5000000 | 3,315,847.14 μs | 33,407.491 μs | 31,249.388 μs |
| OfSeqFSharpAdaptiveMap | 5000000 | 644,114.85 μs | 5,357.031 μs | 4,748.869 μs |
| OfSeqSystemCollectionsImmutableMap | 5000000 | 2,591,355.54 μs | 26,220.613 μs | 24,526.778 μs |
| OfSeqFSharpxChampMap | 5000000 | 2,735,596.61 μs | 19,914.958 μs | 18,628.464 μs |
| OfSeqLangExtMap | 5000000 | 3,239,917.01 μs | 18,435.036 μs | 16,342.179 μs |
| OfSeqHashMap | 10000000 | 3,968,981.92 μs | 22,091.792 μs | 20,664.676 μs |
| OfSeqFSharpXMap | 10000000 | 10,766,557.03 μs | 84,578.072 μs | 79,114.381 μs |
| OfSeqFSharpAdaptiveMap | 10000000 | 1,273,521.80 μs | 3,714.359 μs | 3,292.683 μs |
| OfSeqSystemCollectionsImmutableMap | 10000000 | 5,547,102.95 μs | 63,267.199 μs | 59,180.177 μs |
| OfSeqFSharpxChampMap | 10000000 | 6,120,697.00 μs | 25,847.835 μs | 21,584.113 μs |
| OfSeqLangExtMap | 10000000 | 7,442,931.25 μs | 40,403.324 μs | 37,793.294 μs |
Old Perf
BenchmarkDotNet=v0.13.1, OS=arch
AMD Ryzen 7 3700X, 1 CPU, 16 logical and 8 physical cores
.NET SDK=6.0.110
[Host] : .NET 6.0.10 (6.0.1022.51301), X64 RyuJIT DEBUG
DefaultJob : .NET 6.0.10 (6.0.1022.51301), X64 RyuJIT
| Method | CollectionSize | Mean | Error | StdDev |
|---|---|---|---|---|
| GetHashMap | 10 | 11.29 ns | 0.092 ns | 0.086 ns |
| GetImToolsHashMap | 10 | 31.89 ns | 0.512 ns | 0.797 ns |
| GetFSharpMap | 10 | 26.16 ns | 0.402 ns | 0.376 ns |
| GetFSharpXHashMap | 10 | 111.59 ns | 1.220 ns | 1.081 ns |
| GetSystemCollectionsImmutableMap | 10 | 21.24 ns | 0.297 ns | 0.248 ns |
| GetFSharpDataAdaptiveMap | 10 | 22.83 ns | 0.309 ns | 0.289 ns |
| GetFSharpxChampMap | 10 | 73.06 ns | 0.918 ns | 0.859 ns |
| GetHashMap | 100 | 16.69 ns | 0.135 ns | 0.126 ns |
| GetImToolsHashMap | 100 | 46.71 ns | 0.918 ns | 1.632 ns |
| GetFSharpMap | 100 | 47.37 ns | 0.927 ns | 0.867 ns |
| GetFSharpXHashMap | 100 | 127.49 ns | 1.410 ns | 1.319 ns |
| GetSystemCollectionsImmutableMap | 100 | 34.10 ns | 0.307 ns | 0.287 ns |
| GetFSharpDataAdaptiveMap | 100 | 44.06 ns | 0.475 ns | 0.445 ns |
| GetFSharpxChampMap | 100 | 80.03 ns | 0.710 ns | 0.630 ns |
| GetHashMap | 1000 | 12.53 ns | 0.120 ns | 0.101 ns |
| GetImToolsHashMap | 1000 | 66.82 ns | 0.807 ns | 0.755 ns |
| GetFSharpMap | 1000 | 71.11 ns | 1.033 ns | 0.966 ns |
| GetFSharpXHashMap | 1000 | 143.49 ns | 1.298 ns | 1.214 ns |
| GetSystemCollectionsImmutableMap | 1000 | 50.70 ns | 0.317 ns | 0.296 ns |
| GetFSharpDataAdaptiveMap | 1000 | 66.07 ns | 0.582 ns | 0.544 ns |
| GetFSharpxChampMap | 1000 | 78.60 ns | 0.484 ns | 0.453 ns |
| GetHashMap | 100000 | 27.60 ns | 0.239 ns | 0.223 ns |
| GetImToolsHashMap | 100000 | 193.73 ns | 3.823 ns | 4.249 ns |
| GetFSharpMap | 100000 | 171.37 ns | 3.058 ns | 2.860 ns |
| GetFSharpXHashMap | 100000 | 168.95 ns | 3.308 ns | 3.539 ns |
| GetSystemCollectionsImmutableMap | 100000 | 142.11 ns | 1.265 ns | 1.056 ns |
| GetFSharpDataAdaptiveMap | 100000 | 141.37 ns | 2.015 ns | 1.885 ns |
| GetFSharpxChampMap | 100000 | 100.26 ns | 0.661 ns | 0.618 ns |
| GetHashMap | 500000 | 75.84 ns | 0.737 ns | 0.689 ns |
| GetImToolsHashMap | 500000 | 512.02 ns | 3.893 ns | 3.039 ns |
| GetFSharpMap | 500000 | 298.15 ns | 4.552 ns | 3.801 ns |
| GetFSharpXHashMap | 500000 | 262.19 ns | 3.477 ns | 3.082 ns |
| GetSystemCollectionsImmutableMap | 500000 | 327.87 ns | 5.079 ns | 4.502 ns |
| GetFSharpDataAdaptiveMap | 500000 | 312.62 ns | 5.553 ns | 5.194 ns |
| GetFSharpxChampMap | 500000 | 114.39 ns | 1.843 ns | 1.724 ns |
| GetHashMap | 750000 | 108.36 ns | 0.605 ns | 0.506 ns |
| GetImToolsHashMap | 750000 | 617.69 ns | 5.134 ns | 4.287 ns |
| GetFSharpMap | 750000 | 406.82 ns | 8.131 ns | 7.986 ns |
| GetFSharpXHashMap | 750000 | 380.57 ns | 2.769 ns | 2.590 ns |
| GetSystemCollectionsImmutableMap | 750000 | 422.75 ns | 8.145 ns | 7.619 ns |
| GetFSharpDataAdaptiveMap | 750000 | 358.34 ns | 1.879 ns | 1.757 ns |
| GetFSharpxChampMap | 750000 | 111.80 ns | 1.034 ns | 0.863 ns |
| GetHashMap | 1000000 | 115.40 ns | 0.202 ns | 0.169 ns |
| GetImToolsHashMap | 1000000 | 680.29 ns | 2.240 ns | 1.986 ns |
| GetFSharpMap | 1000000 | 459.53 ns | 3.392 ns | 3.007 ns |
| GetFSharpXHashMap | 1000000 | 360.09 ns | 2.009 ns | 1.781 ns |
| GetSystemCollectionsImmutableMap | 1000000 | 469.63 ns | 3.804 ns | 3.558 ns |
| GetFSharpDataAdaptiveMap | 1000000 | 387.16 ns | 1.962 ns | 1.739 ns |
| GetFSharpxChampMap | 1000000 | 115.44 ns | 0.588 ns | 0.522 ns |
| GetHashMap | 5000000 | 144.12 ns | 0.331 ns | 0.294 ns |
| GetImToolsHashMap | 5000000 | 1,100.96 ns | 4.475 ns | 4.186 ns |
| GetFSharpMap | 5000000 | 797.13 ns | 2.992 ns | 2.798 ns |
| GetFSharpXHashMap | 5000000 | 397.58 ns | 2.569 ns | 2.403 ns |
| GetSystemCollectionsImmutableMap | 5000000 | 784.81 ns | 2.819 ns | 2.201 ns |
| GetFSharpDataAdaptiveMap | 5000000 | 561.12 ns | 2.716 ns | 2.408 ns |
| GetFSharpxChampMap | 5000000 | 268.07 ns | 2.089 ns | 1.852 ns |
| GetHashMap | 10000000 | 163.24 ns | 0.788 ns | 0.737 ns |
| GetImToolsHashMap | 10000000 | 1,318.88 ns | 4.500 ns | 3.989 ns |
| GetFSharpMap | 10000000 | 923.41 ns | 7.067 ns | 6.611 ns |
| GetFSharpXHashMap | 10000000 | 416.53 ns | 1.479 ns | 1.311 ns |
| GetSystemCollectionsImmutableMap | 10000000 | 912.09 ns | 5.060 ns | 4.733 ns |
| GetFSharpDataAdaptiveMap | 10000000 | 655.35 ns | 4.105 ns | 3.639 ns |
| GetFSharpxChampMap | 10000000 | 271.09 ns | 1.815 ns | 1.698 ns |
BenchmarkDotNet=v0.13.1, OS=arch
AMD Ryzen 7 3700X, 1 CPU, 16 logical and 8 physical cores
.NET SDK=6.0.110
[Host] : .NET 6.0.10 (6.0.1022.51301), X64 RyuJIT DEBUG
DefaultJob : .NET 6.0.10 (6.0.1022.51301), X64 RyuJIT
| Method | CollectionSize | Mean | Error | StdDev |
|---|---|---|---|---|
| OfSeqHashMap | 1000 | 103.98 μs | 0.467 μs | 0.390 μs |
| OfSeqFSharpXMap | 1000 | 356.80 μs | 2.247 μs | 2.101 μs |
| OfSeqFSharpAdaptiveMap | 1000 | 88.11 μs | 0.640 μs | 0.598 μs |
| OfSeqSystemCollectionsImmutableMap | 1000 | 267.76 μs | 3.232 μs | 3.024 μs |
| OfSeqFSharpxChampMap | 1000 | 285.94 μs | 1.209 μs | 1.131 μs |
| OfSeqHashMap | 100000 | 13,121.66 μs | 170.604 μs | 159.583 μs |
| OfSeqFSharpXMap | 100000 | 36,832.36 μs | 439.465 μs | 411.076 μs |
| OfSeqFSharpAdaptiveMap | 100000 | 11,062.03 μs | 98.824 μs | 92.440 μs |
| OfSeqSystemCollectionsImmutableMap | 100000 | 40,527.29 μs | 682.578 μs | 638.484 μs |
| OfSeqFSharpxChampMap | 100000 | 35,772.80 μs | 396.413 μs | 370.805 μs |
| OfSeqHashMap | 500000 | 92,064.02 μs | 982.618 μs | 919.142 μs |
| OfSeqFSharpXMap | 500000 | 297,633.34 μs | 4,697.921 μs | 4,394.439 μs |
| OfSeqFSharpAdaptiveMap | 500000 | 56,163.39 μs | 466.852 μs | 436.693 μs |
| OfSeqSystemCollectionsImmutableMap | 500000 | 225,798.19 μs | 3,807.679 μs | 3,561.705 μs |
| OfSeqFSharpxChampMap | 500000 | 180,460.46 μs | 2,781.258 μs | 2,601.591 μs |
| OfSeqHashMap | 750000 | 149,725.31 μs | 1,650.979 μs | 1,544.327 μs |
| OfSeqFSharpXMap | 750000 | 443,484.22 μs | 4,356.750 μs | 3,862.145 μs |
| OfSeqFSharpAdaptiveMap | 750000 | 85,734.12 μs | 641.183 μs | 599.763 μs |
| OfSeqSystemCollectionsImmutableMap | 750000 | 352,489.73 μs | 5,409.123 μs | 5,059.697 μs |
| OfSeqFSharpxChampMap | 750000 | 308,927.44 μs | 3,110.991 μs | 2,757.812 μs |
| OfSeqHashMap | 1000000 | 207,983.72 μs | 810.229 μs | 632.574 μs |
| OfSeqFSharpXMap | 1000000 | 585,059.03 μs | 5,846.471 μs | 5,182.744 μs |
| OfSeqFSharpAdaptiveMap | 1000000 | 118,198.92 μs | 1,768.053 μs | 1,653.838 μs |
| OfSeqSystemCollectionsImmutableMap | 1000000 | 485,328.39 μs | 7,938.198 μs | 7,425.395 μs |
| OfSeqFSharpxChampMap | 1000000 | 447,489.88 μs | 4,162.226 μs | 3,893.349 μs |
| OfSeqHashMap | 5000000 | 1,339,294.84 μs | 12,570.088 μs | 11,758.068 μs |
| OfSeqFSharpXMap | 5000000 | 3,354,458.28 μs | 38,437.491 μs | 35,954.453 μs |
| OfSeqFSharpAdaptiveMap | 5000000 | 634,647.63 μs | 5,274.337 μs | 4,933.618 μs |
| OfSeqSystemCollectionsImmutableMap | 5000000 | 2,800,149.67 μs | 26,051.749 μs | 24,368.822 μs |
| OfSeqFSharpxChampMap | 5000000 | 2,691,413.89 μs | 19,848.124 μs | 18,565.948 μs |
| OfSeqHashMap | 10000000 | 3,158,295.15 μs | 21,919.615 μs | 18,303.871 μs |
| OfSeqFSharpXMap | 10000000 | 10,659,737.70 μs | 208,836.546 μs | 371,206.749 μs |
| OfSeqFSharpAdaptiveMap | 10000000 | 1,247,289.76 μs | 11,839.582 μs | 11,074.752 μs |
| OfSeqSystemCollectionsImmutableMap | 10000000 | 5,838,312.54 μs | 59,046.634 μs | 55,232.258 μs |
| OfSeqFSharpxChampMap | 10000000 | 6,100,685.37 μs | 104,536.576 μs | 97,783.578 μs |