fsharp-hashcollections icon indicating copy to clipboard operation
fsharp-hashcollections copied to clipboard

Move to new hash structure for even more performance

Open mvkara opened this issue 4 years ago • 2 comments

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

mvkara avatar Jan 03 '22 08:01 mvkara

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

mvkara avatar Oct 26 '22 05:10 mvkara

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

mvkara avatar Oct 26 '22 05:10 mvkara