mgravell / Pipelines.Sockets.Unofficial

.NET managed sockets wrapper using the new "Pipelines" API
Other
400 stars 51 forks source link

continuing investigations into MemoryStream-like options #50

Closed mgravell closed 4 years ago

mgravell commented 4 years ago

The plan here is to work towards a Sequence<byte> based implementation using increasing sizes of buffers

mgravell commented 4 years ago

RecyclableMemoryStream does a really good job for large sizes, but is much slower for small sizes, with the cut-off being somewhere around 10k bytes

next step: sequence based

Method Runtime Bytes Mean Error StdDev Ratio RatioSD Gen 0 Gen 1 Gen 2 Allocated
MemoryStream .NET 4.7.2 0 31.535 ns 0.5435 ns 0.5084 ns 1.00 0.00 0.0165 - - 104 B
ArrayPoolStream .NET 4.7.2 0 26.000 ns 0.5136 ns 0.4010 ns 0.82 0.02 0.0114 - - 72 B
RecyclableMemoryStream .NET 4.7.2 0 1,358.886 ns 26.9160 ns 51.8580 ns 43.74 2.15 0.0534 0.0191 0.0019 699 B
MemoryStream .NET Core 3.1 0 10.172 ns 0.1609 ns 0.1505 ns 1.00 0.00 0.0086 - - 72 B
ArrayPoolStream .NET Core 3.1 0 9.504 ns 0.1006 ns 0.0892 ns 0.93 0.02 0.0076 - - 64 B
RecyclableMemoryStream .NET Core 3.1 0 1,266.543 ns 25.2642 ns 58.5537 ns 126.09 7.24 0.0381 0.0172 0.0019 1662 B
MemoryStream .NET 4.7.2 100 66.363 ns 0.7353 ns 0.6878 ns 1.00 0.00 0.0612 - - 385 B
ArrayPoolStream .NET 4.7.2 100 88.631 ns 1.7015 ns 1.6711 ns 1.34 0.03 0.0356 - - 225 B
RecyclableMemoryStream .NET 4.7.2 100 1,428.634 ns 28.5385 ns 79.0801 ns 22.04 1.47 0.0534 0.0191 0.0019 1530 B
MemoryStream .NET Core 3.1 100 43.916 ns 0.8310 ns 1.0510 ns 1.00 0.00 0.0421 - - 352 B
ArrayPoolStream .NET Core 3.1 100 43.723 ns 0.8543 ns 0.9141 ns 1.00 0.03 0.0258 - - 216 B
RecyclableMemoryStream .NET Core 3.1 100 1,288.418 ns 25.7713 ns 63.2174 ns 29.76 1.74 0.0381 0.0191 0.0019 313 B
MemoryStream .NET 4.7.2 1000 114.913 ns 0.6202 ns 0.5801 ns 1.00 0.00 0.1796 0.0006 - 1131 B
ArrayPoolStream .NET 4.7.2 1000 147.929 ns 0.7200 ns 0.6383 ns 1.29 0.01 0.1783 0.0005 - 1123 B
RecyclableMemoryStream .NET 4.7.2 1000 1,503.525 ns 29.5134 ns 53.9669 ns 13.07 0.50 0.0553 0.0191 0.0019 1118 B
MemoryStream .NET Core 3.1 1000 91.894 ns 1.4502 ns 1.3566 ns 1.00 0.00 0.1310 0.0005 - 1096 B
ArrayPoolStream .NET Core 3.1 1000 132.832 ns 2.6670 ns 6.0741 ns 1.47 0.10 0.1378 - - 1112 B
RecyclableMemoryStream .NET Core 3.1 1000 1,156.241 ns 38.3437 ns 113.0573 ns 13.65 1.24 0.0343 0.0153 - 306 B
MemoryStream .NET 4.7.2 10000 2,158.464 ns 28.9042 ns 27.0370 ns 1.00 0.00 4.9210 0.3510 - 31002 B
ArrayPoolStream .NET 4.7.2 10000 1,551.564 ns 21.1653 ns 19.7980 ns 0.72 0.01 2.6226 0.1373 - 16518 B
RecyclableMemoryStream .NET 4.7.2 10000 1,887.913 ns 40.4311 ns 117.9394 ns 0.85 0.05 0.0610 0.0267 0.0019 382 B
MemoryStream .NET Core 3.1 10000 2,056.952 ns 35.0168 ns 32.7547 ns 1.00 0.00 3.6888 0.2136 - 30888 B
ArrayPoolStream .NET Core 3.1 10000 1,205.772 ns 15.5382 ns 14.5345 ns 0.59 0.01 2.9316 - - 16472 B
RecyclableMemoryStream .NET Core 3.1 10000 1,853.907 ns 37.0281 ns 90.8307 ns 0.91 0.04 0.0439 0.0191 0.0019 362 B
MemoryStream .NET 4.7.2 100000 47,175.031 ns 123.6179 ns 115.6322 ns 1.00 0.00 41.6260 41.6260 41.6260 260654 B
ArrayPoolStream .NET 4.7.2 100000 39,193.530 ns 187.9967 ns 166.6542 ns 0.83 0.00 41.6260 41.6260 41.6260 131437 B
RecyclableMemoryStream .NET 4.7.2 100000 9,351.758 ns 95.2914 ns 79.5726 ns 0.20 0.00 0.0305 - - 358 B
MemoryStream .NET Core 3.1 100000 47,428.942 ns 448.2664 ns 419.3087 ns 1.00 0.00 41.6260 41.6260 41.6260 260336 B
ArrayPoolStream .NET Core 3.1 100000 39,455.087 ns 281.2642 ns 263.0947 ns 0.83 0.01 41.6260 41.6260 41.6260 131160 B
RecyclableMemoryStream .NET Core 3.1 100000 9,082.992 ns 33.3913 ns 31.2342 ns 0.19 0.00 0.0305 - - 290 B
MemoryStream .NET 4.7.2 1000000 654,992.341 ns 1,997.3845 ns 1,770.6293 ns 1.00 0.00 499.0234 499.0234 499.0234 2097440 B
ArrayPoolStream .NET 4.7.2 1000000 141,186.688 ns 2,813.2970 ns 5,420.2681 ns 0.22 0.01 247.8027 247.5586 247.5586 1050765 B
RecyclableMemoryStream .NET 4.7.2 1000000 88,965.111 ns 658.3933 ns 583.6485 ns 0.14 0.00 - - - 466 B
MemoryStream .NET Core 3.1 1000000 662,877.822 ns 2,897.4244 ns 2,710.2526 ns 1.00 0.00 499.0234 499.0234 499.0234 2095416 B
ArrayPoolStream .NET Core 3.1 1000000 117,841.641 ns 2,111.5701 ns 1,975.1640 ns 0.18 0.00 249.2676 249.0234 249.0234 1048808 B
RecyclableMemoryStream .NET Core 3.1 1000000 86,971.176 ns 493.5654 ns 437.5329 ns 0.13 0.00 - - - 448 B
MemoryStream .NET 4.7.2 5000000 4,997,106.719 ns 59,552.7542 ns 55,705.6832 ns 1.00 0.00 742.1875 742.1875 742.1875 16777576 B
ArrayPoolStream .NET 4.7.2 5000000 4,541,497.604 ns 37,628.5703 ns 35,197.7880 ns 0.91 0.01 406.2500 406.2500 406.2500 14681191 B
RecyclableMemoryStream .NET 4.7.2 5000000 444,475.013 ns 3,394.3243 ns 3,175.0531 ns 0.09 0.00 - - - 1440 B
MemoryStream .NET Core 3.1 5000000 5,080,289.844 ns 24,816.8018 ns 23,213.6518 ns 1.00 0.00 742.1875 742.1875 742.1875 16775549 B
ArrayPoolStream .NET Core 3.1 5000000 4,581,092.552 ns 51,689.1926 ns 48,350.1028 ns 0.90 0.01 406.2500 406.2500 406.2500 14680198 B
RecyclableMemoryStream .NET Core 3.1 5000000 436,530.762 ns 3,092.1279 ns 2,741.0909 ns 0.09 0.00 - - - 1417 B
MemoryStream .NET 4.7.2 10000000 10,611,844.271 ns 107,145.9158 ns 100,224.3561 ns 1.00 0.00 1484.3750 1484.3750 1484.3750 33554816 B
ArrayPoolStream .NET 4.7.2 10000000 10,675,970.081 ns 210,178.4128 ns 294,640.7808 ns 1.00 0.03 640.6250 640.6250 640.6250 31459160 B
RecyclableMemoryStream .NET 4.7.2 10000000 899,959.691 ns 12,101.5049 ns 10,105.3046 ns 0.08 0.00 - - - 2496 B
MemoryStream .NET Core 3.1 10000000 10,484,287.188 ns 94,963.8119 ns 88,829.2086 ns 1.00 0.00 1484.3750 1484.3750 1484.3750 33552780 B
ArrayPoolStream .NET Core 3.1 10000000 12,541,539.844 ns 62,052.4208 ns 55,007.8548 ns 1.20 0.01 640.6250 640.6250 640.6250 31457432 B
RecyclableMemoryStream .NET Core 3.1 10000000 874,434.193 ns 6,288.8093 ns 5,882.5561 ns 0.08 0.00 - - - 2464 B
MemoryStream .NET 4.7.2 50000000 48,842,408.485 ns 290,148.3675 ns 271,404.9629 ns 1.00 0.00 3909.0909 3909.0909 3909.0909 134218160 B
ArrayPoolStream .NET 4.7.2 50000000 48,533,021.818 ns 945,218.6395 ns 884,158.1019 ns 0.99 0.02 1909.0909 1909.0909 1909.0909 132126025 B
RecyclableMemoryStream .NET 4.7.2 50000000 4,478,409.375 ns 39,180.4535 ns 36,649.4205 ns 0.09 0.00 - - - 8704 B
MemoryStream .NET Core 3.1 50000000 48,364,053.333 ns 392,719.9978 ns 367,350.5296 ns 1.00 0.00 3909.0909 3909.0909 3909.0909 134216233 B
ArrayPoolStream .NET Core 3.1 50000000 46,871,068.831 ns 154,258.7105 ns 136,746.3289 ns 0.97 0.01 1909.0909 1909.0909 1909.0909 132120882 B
RecyclableMemoryStream .NET Core 3.1 50000000 4,352,979.844 ns 26,941.8210 ns 25,201.3961 ns 0.09 0.00 - - - 8656 B
mgravell commented 4 years ago

results with sequence implementation; at the high end, still out-performed by RecyclableMemoryStream

Method Runtime Bytes Mean Error StdDev Median Ratio RatioSD Gen 0 Gen 1 Gen 2 Allocated
MemoryStream .NET 4.7.2 0 31.56 ns 0.798 ns 1.768 ns 30.91 ns 1.00 0.00 0.0165 - - 104 B
ArrayPoolStream .NET 4.7.2 0 79.62 ns 0.372 ns 0.348 ns 79.71 ns 2.49 0.14 0.0509 - - 321 B
RecyclableMemoryStream .NET 4.7.2 0 1,347.77 ns 26.626 ns 47.327 ns 1,352.22 ns 42.22 3.25 0.0534 0.0172 0.0019 518 B
MemoryStream .NET Core 3.1 0 10.08 ns 0.224 ns 0.199 ns 10.03 ns 1.00 0.00 0.0086 - - 72 B
ArrayPoolStream .NET Core 3.1 0 40.12 ns 0.822 ns 0.807 ns 40.13 ns 3.99 0.12 0.0373 - - 312 B
RecyclableMemoryStream .NET Core 3.1 0 1,244.11 ns 24.744 ns 59.285 ns 1,249.98 ns 122.38 4.74 0.0381 0.0191 0.0019 1412 B
MemoryStream .NET 4.7.2 100 65.18 ns 0.537 ns 0.502 ns 65.18 ns 1.00 0.00 0.0612 - - 385 B
ArrayPoolStream .NET 4.7.2 100 101.02 ns 5.968 ns 6.128 ns 99.50 ns 1.55 0.10 0.0509 - - 321 B
RecyclableMemoryStream .NET 4.7.2 100 1,403.89 ns 27.776 ns 63.260 ns 1,394.41 ns 21.93 0.89 0.0553 0.0191 0.0019 740 B
MemoryStream .NET Core 3.1 100 42.51 ns 0.508 ns 0.475 ns 42.51 ns 1.00 0.00 0.0421 - - 352 B
ArrayPoolStream .NET Core 3.1 100 49.18 ns 0.681 ns 0.604 ns 49.16 ns 1.16 0.02 0.0373 - - 312 B
RecyclableMemoryStream .NET Core 3.1 100 1,041.01 ns 35.011 ns 101.014 ns 1,013.24 ns 25.03 2.67 0.0420 0.0191 0.0038 333 B
MemoryStream .NET 4.7.2 1000 115.50 ns 1.511 ns 1.413 ns 115.81 ns 1.00 0.00 0.1796 0.0006 - 1131 B
ArrayPoolStream .NET 4.7.2 1000 380.22 ns 1.978 ns 1.850 ns 380.46 ns 3.29 0.04 0.3781 0.0029 - 2383 B
RecyclableMemoryStream .NET 4.7.2 1000 1,445.68 ns 28.936 ns 75.207 ns 1,436.08 ns 12.66 0.55 0.0553 0.0191 0.0019 381 B
MemoryStream .NET Core 3.1 1000 88.63 ns 0.905 ns 0.846 ns 88.63 ns 1.00 0.00 0.1310 0.0005 - 1096 B
ArrayPoolStream .NET Core 3.1 1000 352.14 ns 2.430 ns 2.273 ns 352.23 ns 3.97 0.05 0.3066 0.0014 - 2368 B
RecyclableMemoryStream .NET Core 3.1 1000 1,349.20 ns 27.007 ns 63.659 ns 1,350.24 ns 15.17 0.60 0.0420 0.0191 0.0019 345 B
MemoryStream .NET 4.7.2 10000 2,085.00 ns 25.176 ns 23.549 ns 2,082.40 ns 1.00 0.00 4.9210 0.3510 - 31002 B
ArrayPoolStream .NET 4.7.2 10000 1,579.61 ns 11.700 ns 10.944 ns 1,578.85 ns 0.76 0.01 2.7008 0.1335 - 17026 B
RecyclableMemoryStream .NET 4.7.2 10000 1,849.66 ns 39.236 ns 115.689 ns 1,850.39 ns 0.91 0.06 0.0629 0.0305 0.0019 394 B
MemoryStream .NET Core 3.1 10000 1,993.51 ns 28.475 ns 26.635 ns 1,993.91 ns 1.00 0.00 3.6888 0.2136 - 30888 B
ArrayPoolStream .NET Core 3.1 10000 1,503.49 ns 16.398 ns 15.339 ns 1,508.54 ns 0.75 0.01 3.4237 - - 16968 B
RecyclableMemoryStream .NET Core 3.1 10000 1,761.46 ns 37.728 ns 110.649 ns 1,749.59 ns 0.88 0.07 0.0420 0.0191 - 367 B
MemoryStream .NET 4.7.2 100000 47,137.33 ns 347.798 ns 308.314 ns 47,276.85 ns 1.00 0.00 41.6260 41.6260 41.6260 260654 B
ArrayPoolStream .NET 4.7.2 100000 9,119.75 ns 121.150 ns 113.324 ns 9,164.73 ns 0.19 0.00 20.8282 5.2032 - 132117 B
RecyclableMemoryStream .NET 4.7.2 100000 9,364.11 ns 53.892 ns 50.411 ns 9,347.91 ns 0.20 0.00 0.0305 - - 358 B
MemoryStream .NET Core 3.1 100000 47,186.31 ns 336.385 ns 314.655 ns 47,316.02 ns 1.00 0.00 41.6260 41.6260 41.6260 260336 B
ArrayPoolStream .NET Core 3.1 100000 6,592.10 ns 60.844 ns 53.937 ns 6,601.57 ns 0.14 0.00 19.9966 - - 131920 B
RecyclableMemoryStream .NET Core 3.1 100000 9,089.94 ns 29.140 ns 22.750 ns 9,083.63 ns 0.19 0.00 0.0305 - - 376 B
MemoryStream .NET 4.7.2 1000000 659,018.44 ns 3,564.192 ns 3,333.947 ns 659,427.73 ns 1.00 0.00 499.0234 499.0234 499.0234 2097440 B
ArrayPoolStream .NET 4.7.2 1000000 235,549.60 ns 1,668.706 ns 1,560.908 ns 235,699.00 ns 0.36 0.00 285.6445 285.6445 285.6445 1051182 B
RecyclableMemoryStream .NET 4.7.2 1000000 88,706.27 ns 545.722 ns 483.769 ns 88,491.26 ns 0.13 0.00 - - - 466 B
MemoryStream .NET Core 3.1 1000000 659,999.81 ns 3,722.896 ns 3,482.399 ns 660,565.82 ns 1.00 0.00 499.0234 499.0234 499.0234 2095416 B
ArrayPoolStream .NET Core 3.1 1000000 229,783.14 ns 2,136.096 ns 1,998.105 ns 229,855.64 ns 0.35 0.00 285.6445 285.6445 285.6445 1049688 B
RecyclableMemoryStream .NET Core 3.1 1000000 89,642.65 ns 1,936.269 ns 3,071.128 ns 88,432.63 ns 0.14 0.01 - - - 448 B
MemoryStream .NET 4.7.2 5000000 5,041,604.06 ns 55,208.172 ns 51,641.758 ns 5,041,765.63 ns 1.00 0.00 742.1875 742.1875 742.1875 16777576 B
ArrayPoolStream .NET 4.7.2 5000000 955,920.57 ns 5,690.019 ns 5,322.447 ns 957,413.48 ns 0.19 0.00 798.8281 798.8281 798.8281 8400400 B
RecyclableMemoryStream .NET 4.7.2 5000000 442,755.70 ns 3,541.614 ns 3,312.827 ns 442,652.73 ns 0.09 0.00 - - - 1440 B
MemoryStream .NET Core 3.1 5000000 5,071,695.16 ns 19,295.652 ns 18,049.164 ns 5,067,605.47 ns 1.00 0.00 742.1875 742.1875 742.1875 16775546 B
ArrayPoolStream .NET Core 3.1 5000000 919,627.91 ns 42,034.376 ns 122,616.248 ns 924,529.59 ns 0.20 0.02 998.0469 998.0469 998.0469 8394483 B
RecyclableMemoryStream .NET Core 3.1 5000000 436,131.11 ns 2,501.133 ns 2,339.562 ns 436,214.26 ns 0.09 0.00 - - - 1416 B
MemoryStream .NET 4.7.2 10000000 10,256,499.48 ns 38,937.840 ns 36,422.479 ns 10,260,367.19 ns 1.00 0.00 1484.3750 1484.3750 1484.3750 33554816 B
ArrayPoolStream .NET 4.7.2 10000000 3,877,524.34 ns 44,963.928 ns 37,546.917 ns 3,876,889.84 ns 0.38 0.00 667.9688 667.9688 667.9688 16783080 B
RecyclableMemoryStream .NET 4.7.2 10000000 908,747.61 ns 18,122.028 ns 18,609.989 ns 904,033.20 ns 0.09 0.00 - - - 2496 B
MemoryStream .NET Core 3.1 10000000 10,563,231.38 ns 44,563.358 ns 34,792.139 ns 10,560,396.09 ns 1.00 0.00 1484.3750 1484.3750 1484.3750 33552780 B
ArrayPoolStream .NET Core 3.1 10000000 3,602,297.04 ns 115,478.668 ns 118,588.090 ns 3,539,509.38 ns 0.34 0.01 667.9688 667.9688 667.9688 16778672 B
RecyclableMemoryStream .NET Core 3.1 10000000 871,378.97 ns 5,613.780 ns 5,251.133 ns 871,716.21 ns 0.08 0.00 - - - 2464 B
MemoryStream .NET 4.7.2 50000000 48,372,867.13 ns 170,973.312 ns 142,770.459 ns 48,395,772.73 ns 1.00 0.00 3909.0909 3909.0909 3909.0909 134218160 B
ArrayPoolStream .NET 4.7.2 50000000 12,937,835.44 ns 253,637.548 ns 437,512.308 ns 13,022,316.41 ns 0.27 0.01 937.5000 937.5000 937.5000 50342363 B
RecyclableMemoryStream .NET 4.7.2 50000000 4,412,522.19 ns 38,235.410 ns 35,765.426 ns 4,408,968.75 ns 0.09 0.00 - - - 8704 B
MemoryStream .NET Core 3.1 50000000 47,986,537.58 ns 206,108.129 ns 192,793.671 ns 47,892,845.45 ns 1.00 0.00 3909.0909 3909.0909 3909.0909 134216233 B
ArrayPoolStream .NET Core 3.1 50000000 19,247,789.17 ns 76,336.234 ns 71,404.961 ns 19,252,596.88 ns 0.40 0.00 1000.0000 1000.0000 1000.0000 50333456 B
RecyclableMemoryStream .NET Core 3.1 50000000 4,349,538.73 ns 32,147.315 ns 28,497.758 ns 4,351,389.06 ns 0.09 0.00 - - - 8666 B