Skip to content
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

Add UnixFileStreamStrategy #55191

Merged
merged 3 commits into from
Jul 8, 2021
Merged

Conversation

stephentoub
Copy link
Member

Fixes #53809

As with the Windows strategy, there are some subtle differences from the Net5Compat implementation (which remains behind the compat flag for now). In particular, ReadAsync no longer employs a semaphore to serialize operations, so attempts to use an unbuffered FileStream.ReadAsync concurrently on Unix will not work well (nor should it).

cc: @adamsitnik

@stephentoub stephentoub added area-System.IO tenet-performance Performance related issue labels Jul 6, 2021
@stephentoub stephentoub added this to the 6.0.0 milestone Jul 6, 2021
@ghost
Copy link

ghost commented Jul 6, 2021

Tagging subscribers to this area: @dotnet/area-system-io
See info in area-owners.md if you want to be subscribed.

Issue Details

Fixes #53809

As with the Windows strategy, there are some subtle differences from the Net5Compat implementation (which remains behind the compat flag for now). In particular, ReadAsync no longer employs a semaphore to serialize operations, so attempts to use an unbuffered FileStream.ReadAsync concurrently on Unix will not work well (nor should it).

cc: @adamsitnik

Author: stephentoub
Assignees: -
Labels:

area-System.IO, tenet-performance

Milestone: 6.0.0

Copy link
Member

@adamsitnik adamsitnik left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Big thanks for doing this @stephentoub!

Could you please enable the .NET 5 Compat tests for Unix as well?

<!-- Windows is currently the only OS for which we provide a new strategy, so we test the Net5Compat only for Windows -->

- <!-- Windows is currently the only OS for which we provide a new strategy, so we test the Net5Compat only for Windows -->
- <TargetFrameworks>$(NetCoreAppCurrent)-windows</TargetFrameworks>
+ <TargetFrameworks>$(NetCoreAppCurrent)-windows;$(NetCoreAppCurrent)-Unix;</TargetFrameworks>

@adamsitnik
Copy link
Member

@stephentoub please let me know if you need some help in getting the benchmark numbers

@stephentoub
Copy link
Member Author

please let me know if you need some help in getting the benchmark numbers

Thanks. I've run them. I'd welcome seeing results from another machine, though. Seems like the ones that matter most got better, but you're more familiar with these tests, their stability, and their relative impact.

dotnet run --base ~/results/before --diff ~/results/after --threshold 5%
summary:
better: 22, geomean: 1.997
worse: 18, geomean: 1.252
total diff: 40

Faster base/diff Base Median (ns) Diff Median (ns) Modality
System.IO.Tests.Perf_FileStream.SeekForward(fileSize: 1024, options: Asynchronou 26.53 448831.43 16918.17
System.IO.Tests.Perf_FileStream.SeekForward(fileSize: 1024, options: None) 25.64 448720.45 17498.99
System.IO.Tests.Perf_FileStream.ReadAsync(fileSize: 1048576, userBufferSize: 512 3.41 2745570.00 804766.12
System.IO.Tests.Perf_FileStream.Read(fileSize: 1048576, userBufferSize: 512, opt 3.28 699269.29 213067.40
System.IO.Tests.Perf_FileStream.Read(fileSize: 1048576, userBufferSize: 4096, op 2.90 483398.96 166835.70
System.IO.Tests.Perf_FileStream.Read_NoBuffering(fileSize: 1048576, userBufferSi 2.23 184168.68 82750.74
System.IO.Tests.Perf_FileStream.Read(fileSize: 104857600, userBufferSize: 4096, 2.18 53781400.00 24664255.00
System.IO.Tests.Perf_FileStream.Read_NoBuffering(fileSize: 104857600, userBuffer 1.58 24856100.00 15689533.33
System.IO.Tests.Perf_FileStream.WriteAsync(fileSize: 1048576, userBufferSize: 51 1.47 5678831.25 3858899.22
System.IO.Tests.Perf_FileStream.ReadAsync_NoBuffering(fileSize: 1048576, userBuf 1.41 213015.79 151455.26
System.IO.Tests.Perf_FileStream.WriteAsync(fileSize: 1024, userBufferSize: 1024, 1.41 212876.56 151459.99
System.IO.Tests.Perf_FileStream.Write_NoBuffering(fileSize: 1048576, userBufferS 1.40 3391434.38 2414748.96
System.IO.Tests.Perf_FileStream.Write(fileSize: 1048576, userBufferSize: 512, op 1.38 3757940.63 2727214.29
System.IO.Tests.Perf_FileStream.Write(fileSize: 1048576, userBufferSize: 4096, o 1.33 3372741.25 2533917.71
System.IO.Tests.Perf_FileStream.Read(fileSize: 1024, userBufferSize: 1024, optio 1.31 7252.83 5519.34
System.IO.Tests.Perf_FileStream.Write_NoBuffering(fileSize: 104857600, userBuffe 1.19 207185100.00 174002900.00 bimodal
System.IO.Tests.Perf_FileStream.ReadAsync_NoBuffering(fileSize: 1048576, userBuf 1.17 195840.47 167346.40 bimodal
System.IO.Tests.Perf_FileStream.Write(fileSize: 104857600, userBufferSize: 4096, 1.17 212842500.00 181985400.00
System.IO.Tests.Perf_FileStream.Write_NoBuffering(fileSize: 1048576, userBufferS 1.14 2782944.79 2436131.25
System.IO.Tests.Perf_FileStream.ReadByte(fileSize: 1024, options: Asynchronous) 1.13 9710.30 8577.47
System.IO.Tests.Perf_FileStream.ReadByte(fileSize: 1024, options: None) 1.09 9465.40 8676.82
System.IO.Tests.Perf_FileStream.ReadAsync(fileSize: 104857600, userBufferSize: 4 1.06 42139600.00 39679587.50
Slower diff/base Base Median (ns) Diff Median (ns) Modality
System.IO.Tests.Perf_FileStream.FlushAsync(fileSize: 1024, options: None) 2.20 1444209.66 3178962.50
System.IO.Tests.Perf_FileStream.FlushAsync(fileSize: 1024, options: Asynchronous 2.08 1433528.98 2981252.50
System.IO.Tests.Perf_FileStream.WriteAsync(fileSize: 1048576, userBufferSize: 40 1.46 2400020.09 3504236.88 several?
System.IO.Tests.Perf_FileStream.WriteAsync(fileSize: 1048576, userBufferSize: 51 1.32 2891966.88 3819548.44
System.IO.Tests.Perf_FileStream.ReadAsync(fileSize: 1048576, userBufferSize: 512 1.31 651719.49 853493.59
System.IO.Tests.Perf_FileStream.WriteAsync_NoBuffering(fileSize: 1048576, userBu 1.25 2528863.13 3167388.75
System.IO.Tests.Perf_FileStream.WriteAsync(fileSize: 1048576, userBufferSize: 40 1.20 2927753.75 3518150.63
System.IO.Tests.Perf_FileStream.Write(fileSize: 1048576, userBufferSize: 512, op 1.17 2283541.52 2678497.92 several?
System.IO.Tests.Perf_FileStream.CopyToFile(fileSize: 1048576, options: None) 1.15 2507296.88 2878378.65
System.IO.Tests.Perf_FileStream.ReadAsync(fileSize: 1048576, userBufferSize: 409 1.14 432771.27 494837.68 several?
System.IO.Tests.Perf_FileStream.WriteAsync(fileSize: 104857600, userBufferSize: 1.12 198299200.00 222205800.00
System.IO.Tests.Perf_FileStream.Read_NoBuffering(fileSize: 104857600, userBuffer 1.11 14698708.82 16320806.67
System.IO.Tests.Perf_FileStream.SeekBackward(fileSize: 1024, options: None) 1.11 447950.59 495893.85
System.IO.Tests.Perf_FileStream.Write(fileSize: 104857600, userBufferSize: 4096, 1.10 170165200.00 188027850.00
System.IO.Tests.Perf_FileStream.WriteAsync(fileSize: 104857600, userBufferSize: 1.09 205111800.00 224078250.00
System.IO.Tests.Perf_FileStream.Read(fileSize: 1024, userBufferSize: 1024, optio 1.09 5023.82 5470.61
System.IO.Tests.Perf_FileStream.SeekBackward(fileSize: 1024, options: Asynchrono 1.09 448502.50 487023.44
System.IO.Tests.Perf_FileStream.Write(fileSize: 1024, userBufferSize: 1024, opti 1.08 141219.99 152202.91

Method Job Toolchain fileSize userBufferSize options Mean Error StdDev Median Min Max Ratio RatioSD Gen 0 Gen 1 Gen 2 Allocated
Read Job-QPGETX /main/corerun 1024 1024 None 5.138 us 0.0579 us 0.0484 us 5.139 us 5.081 us 5.218 us 1.00 0.00 0.6857 0.3324 - 4,384 B
Read Job-BAGWTC /pr/corerun 1024 1024 None 5.410 us 0.0880 us 0.0823 us 5.360 us 5.334 us 5.550 us 1.05 0.02 0.6870 0.3435 - 4,432 B
Write Job-QPGETX /main/corerun 1024 1024 None 149.836 us 4.8452 us 5.5798 us 150.599 us 138.491 us 158.668 us 1.00 0.00 0.5896 - - 4,384 B
Write Job-BAGWTC /pr/corerun 1024 1024 None 143.096 us 2.7787 us 2.7290 us 142.495 us 140.026 us 148.631 us 0.96 0.03 0.5896 - - 4,432 B
ReadAsync Job-QPGETX /main/corerun 1024 1024 None 7.929 us 0.1564 us 0.1801 us 7.894 us 7.661 us 8.333 us 1.00 0.00 1.0070 0.5035 - 4,768 B
ReadAsync Job-BAGWTC /pr/corerun 1024 1024 None 7.993 us 0.3182 us 0.3664 us 7.865 us 7.565 us 8.783 us 1.01 0.05 0.7876 0.3780 - 5,008 B
WriteAsync Job-QPGETX /main/corerun 1024 1024 None 211.533 us 4.2282 us 4.6996 us 211.947 us 202.320 us 221.871 us 1.00 0.00 - - - 4,832 B
WriteAsync Job-BAGWTC /pr/corerun 1024 1024 None 142.699 us 2.9520 us 3.2812 us 142.572 us 135.747 us 148.574 us 0.67 0.02 0.5734 - - 4,520 B
Read Job-QPGETX /main/corerun 1024 1024 Asynchronous 7.263 us 0.1429 us 0.1588 us 7.235 us 6.986 us 7.611 us 1.00 0.00 0.9907 0.4953 - 4,624 B
Read Job-BAGWTC /pr/corerun 1024 1024 Asynchronous 5.284 us 0.1053 us 0.0985 us 5.276 us 5.156 us 5.454 us 0.73 0.02 0.6973 0.3381 - 4,432 B
Write Job-QPGETX /main/corerun 1024 1024 Asynchronous 145.150 us 3.9165 us 4.5102 us 145.183 us 139.103 us 155.263 us 1.00 0.00 0.5631 - - 4,504 B
Write Job-BAGWTC /pr/corerun 1024 1024 Asynchronous 149.928 us 5.2243 us 5.8068 us 149.182 us 140.819 us 162.077 us 1.04 0.05 0.5841 - - 4,432 B
ReadAsync Job-QPGETX /main/corerun 1024 1024 Asynchronous 7.618 us 0.1370 us 0.1144 us 7.602 us 7.482 us 7.868 us 1.00 0.00 1.0039 0.4858 - 4,808 B
ReadAsync Job-BAGWTC /pr/corerun 1024 1024 Asynchronous 7.617 us 0.0466 us 0.0389 us 7.608 us 7.567 us 7.696 us 1.00 0.01 0.7708 0.3700 - 5,008 B
WriteAsync Job-QPGETX /main/corerun 1024 1024 Asynchronous 150.201 us 3.8799 us 4.4681 us 151.724 us 141.856 us 155.483 us 1.00 0.00 0.5734 - - 4,504 B
WriteAsync Job-BAGWTC /pr/corerun 1024 1024 Asynchronous 140.539 us 2.5148 us 2.3524 us 140.657 us 137.313 us 144.042 us 0.94 0.04 0.5531 - - 4,520 B
OpenClose Job-QPGETX /main/corerun 1024 ? None 3.424 us 0.0112 us 0.0099 us 3.424 us 3.409 us 3.444 us 1.00 0.00 0.0412 0.0137 - 264 B
OpenClose Job-BAGWTC /pr/corerun 1024 ? None 3.495 us 0.0300 us 0.0281 us 3.486 us 3.461 us 3.551 us 1.02 0.01 0.0417 0.0139 - 312 B
LockUnlock Job-QPGETX /main/corerun 1024 ? None 5.575 us 0.0196 us 0.0174 us 5.577 us 5.535 us 5.602 us 1.00 0.00 0.0222 - - 264 B
LockUnlock Job-BAGWTC /pr/corerun 1024 ? None 6.024 us 0.1177 us 0.1101 us 5.981 us 5.887 us 6.235 us 1.08 0.02 0.0461 0.0231 - 312 B
SeekForward Job-QPGETX /main/corerun 1024 ? None 449.980 us 7.8513 us 7.3441 us 450.813 us 436.381 us 463.271 us 1.00 0.00 - - - 265 B
SeekForward Job-BAGWTC /pr/corerun 1024 ? None 17.356 us 0.2963 us 0.2771 us 17.298 us 17.001 us 17.900 us 0.04 0.00 - - - 312 B
SeekBackward Job-QPGETX /main/corerun 1024 ? None 454.440 us 1.7835 us 1.6683 us 454.302 us 452.401 us 457.656 us 1.00 0.00 - - - 265 B
SeekBackward Job-BAGWTC /pr/corerun 1024 ? None 498.374 us 3.8069 us 3.1789 us 498.023 us 492.054 us 503.325 us 1.10 0.01 - - - 313 B
ReadByte Job-QPGETX /main/corerun 1024 ? None 9.638 us 0.2052 us 0.2281 us 9.683 us 9.307 us 10.021 us 1.00 0.00 0.6645 0.3127 - 4,384 B
ReadByte Job-BAGWTC /pr/corerun 1024 ? None 8.690 us 0.1883 us 0.1933 us 8.616 us 8.409 us 9.086 us 0.90 0.02 0.6836 0.3238 - 4,432 B
WriteByte Job-QPGETX /main/corerun 1024 ? None 144.382 us 14.7800 us 16.4279 us 143.020 us 101.155 us 172.095 us 1.00 0.00 0.5580 - - 4,384 B
WriteByte Job-BAGWTC /pr/corerun 1024 ? None 140.033 us 9.2427 us 10.6439 us 142.418 us 101.423 us 148.904 us 0.98 0.14 0.5531 - - 4,432 B
Flush Job-QPGETX /main/corerun 1024 ? None 1,445.631 us 24.1897 us 21.4436 us 1,442.204 us 1,421.856 us 1,488.463 us 1.00 0.00 - - - 4,387 B
Flush Job-BAGWTC /pr/corerun 1024 ? None 1,427.810 us 15.8460 us 14.8224 us 1,426.088 us 1,399.275 us 1,448.203 us 0.99 0.02 - - - 4,435 B
FlushAsync Job-QPGETX /main/corerun 1024 ? None 1,460.382 us 23.2935 us 21.7887 us 1,464.585 us 1,428.019 us 1,501.792 us 1.00 0.00 - - - 4,387 B
FlushAsync Job-BAGWTC /pr/corerun 1024 ? None 3,035.240 us 85.1788 us 87.4723 us 3,020.682 us 2,932.185 us 3,293.367 us 2.08 0.07 25.0000 - - 160,495 B
CopyToFile Job-QPGETX /main/corerun 1024 ? None 150.521 us 5.2368 us 6.0307 us 150.695 us 141.094 us 161.134 us 1.00 0.00 1.2500 0.6250 - 8,768 B
CopyToFile Job-BAGWTC /pr/corerun 1024 ? None 149.819 us 6.3749 us 7.0857 us 149.045 us 142.419 us 169.224 us 1.00 0.05 0.6188 - - 4,744 B
CopyToFileAsync Job-QPGETX /main/corerun 1024 ? None 229.800 us 4.4597 us 4.5798 us 231.209 us 219.712 us 234.873 us 1.00 0.00 1.8382 0.9191 - 9,657 B
CopyToFileAsync Job-BAGWTC /pr/corerun 1024 ? None 228.614 us 4.4826 us 4.1931 us 228.240 us 221.907 us 235.688 us 1.00 0.02 0.8681 - - 5,560 B
OpenClose Job-QPGETX /main/corerun 1024 ? Asynchronous 3.653 us 0.0577 us 0.0540 us 3.653 us 3.552 us 3.723 us 1.00 0.00 0.0585 0.0293 - 384 B
OpenClose Job-BAGWTC /pr/corerun 1024 ? Asynchronous 3.558 us 0.0405 us 0.0359 us 3.547 us 3.520 us 3.652 us 0.97 0.02 0.0424 0.0141 - 312 B
LockUnlock Job-QPGETX /main/corerun 1024 ? Asynchronous 6.103 us 0.0737 us 0.0653 us 6.104 us 5.998 us 6.239 us 1.00 0.00 0.0489 0.0244 - 384 B
LockUnlock Job-BAGWTC /pr/corerun 1024 ? Asynchronous 5.900 us 0.0689 us 0.0538 us 5.896 us 5.833 us 6.006 us 0.96 0.01 0.0467 0.0234 - 312 B
SeekForward Job-QPGETX /main/corerun 1024 ? Asynchronous 449.817 us 7.0763 us 6.6192 us 449.298 us 442.077 us 464.869 us 1.00 0.00 - - - 385 B
SeekForward Job-BAGWTC /pr/corerun 1024 ? Asynchronous 17.237 us 0.0696 us 0.0651 us 17.247 us 17.118 us 17.336 us 0.04 0.00 - - - 312 B
SeekBackward Job-QPGETX /main/corerun 1024 ? Asynchronous 451.809 us 5.1902 us 4.8550 us 450.947 us 444.028 us 460.332 us 1.00 0.00 - - - 385 B
SeekBackward Job-BAGWTC /pr/corerun 1024 ? Asynchronous 492.744 us 2.0518 us 1.8189 us 492.569 us 490.446 us 496.816 us 1.09 0.01 - - - 313 B
ReadByte Job-QPGETX /main/corerun 1024 ? Asynchronous 9.553 us 0.1292 us 0.1208 us 9.543 us 9.374 us 9.745 us 1.00 0.00 0.7167 0.3395 - 4,504 B
ReadByte Job-BAGWTC /pr/corerun 1024 ? Asynchronous 8.532 us 0.1123 us 0.0995 us 8.524 us 8.402 us 8.744 us 0.89 0.02 0.7038 0.3351 - 4,432 B
WriteByte Job-QPGETX /main/corerun 1024 ? Asynchronous 146.107 us 5.4324 us 6.2560 us 146.081 us 132.700 us 155.379 us 1.00 0.00 0.5580 - - 4,504 B
WriteByte Job-BAGWTC /pr/corerun 1024 ? Asynchronous 146.575 us 3.9805 us 4.4243 us 146.108 us 141.505 us 154.773 us 1.00 0.05 0.5631 - - 4,432 B
Flush Job-QPGETX /main/corerun 1024 ? Asynchronous 1,465.149 us 29.0065 us 29.7876 us 1,473.030 us 1,420.535 us 1,514.044 us 1.00 0.00 - - - 4,507 B
Flush Job-BAGWTC /pr/corerun 1024 ? Asynchronous 1,429.309 us 17.6175 us 16.4794 us 1,430.584 us 1,404.666 us 1,464.736 us 0.97 0.02 - - - 4,435 B
FlushAsync Job-QPGETX /main/corerun 1024 ? Asynchronous 1,453.589 us 19.9868 us 18.6957 us 1,456.899 us 1,417.828 us 1,483.716 us 1.00 0.00 - - - 4,507 B
FlushAsync Job-BAGWTC /pr/corerun 1024 ? Asynchronous 3,256.667 us 161.5740 us 179.5891 us 3,242.541 us 3,004.659 us 3,562.605 us 2.24 0.14 15.6250 - - 160,507 B
CopyToFileAsync Job-QPGETX /main/corerun 1024 ? Asynchronous 233.585 us 10.7639 us 11.9640 us 229.083 us 218.522 us 262.575 us 1.00 0.00 1.8116 0.9058 - 9,625 B
CopyToFileAsync Job-BAGWTC /pr/corerun 1024 ? Asynchronous 228.227 us 1.8647 us 1.6530 us 228.272 us 225.020 us 231.415 us 0.97 0.05 0.9058 - - 5,561 B
Read Job-QPGETX /main/corerun 1048576 512 None 212.888 us 0.8929 us 0.8352 us 212.995 us 210.851 us 213.733 us 1.00 0.00 - - - 4,384 B
Read Job-BAGWTC /pr/corerun 1048576 512 None 243.563 us 29.2624 us 33.6986 us 229.588 us 213.017 us 325.227 us 1.14 0.16 - - - 4,432 B
Write Job-QPGETX /main/corerun 1048576 512 None 2,093.811 us 60.8082 us 65.0641 us 2,103.629 us 1,911.552 us 2,179.008 us 1.00 0.00 - - - 4,387 B
Write Job-BAGWTC /pr/corerun 1048576 512 None 2,869.496 us 332.1857 us 326.2508 us 2,788.768 us 2,507.765 us 3,661.121 us 1.37 0.15 - - - 4,436 B
ReadAsync Job-QPGETX /main/corerun 1048576 512 None 2,673.695 us 40.2207 us 33.5861 us 2,682.967 us 2,629.444 us 2,719.044 us 1.00 0.00 31.2500 - - 234,111 B
ReadAsync Job-BAGWTC /pr/corerun 1048576 512 None 890.693 us 81.8059 us 94.2078 us 859.895 us 764.471 us 1,086.032 us 0.35 0.03 6.2500 - - 56,048 B
WriteAsync Job-QPGETX /main/corerun 1048576 512 None 7,395.528 us 1,190.6268 us 1,323.3785 us 7,055.125 us 5,742.475 us 10,715.698 us 1.00 0.00 20.8333 - - 234,112 B
WriteAsync Job-BAGWTC /pr/corerun 1048576 512 None 4,229.759 us 493.7940 us 568.6539 us 4,285.571 us 3,174.620 us 5,226.970 us 0.59 0.12 - - - 49,774 B
Read Job-QPGETX /main/corerun 1048576 512 Asynchronous 874.329 us 43.4114 us 48.2516 us 878.890 us 755.174 us 957.562 us 1.00 0.00 3.6765 - - 35,320 B
Read Job-BAGWTC /pr/corerun 1048576 512 Asynchronous 284.112 us 13.3124 us 15.3305 us 281.115 us 264.809 us 304.946 us 0.33 0.03 - - - 4,432 B
Write Job-QPGETX /main/corerun 1048576 512 Asynchronous 4,143.986 us 334.6667 us 371.9811 us 4,115.753 us 3,519.794 us 4,993.936 us 1.00 0.00 - - - 33,264 B
Write Job-BAGWTC /pr/corerun 1048576 512 Asynchronous 3,011.702 us 167.4032 us 179.1196 us 2,984.304 us 2,680.668 us 3,364.220 us 0.73 0.08 - - - 4,437 B
ReadAsync Job-QPGETX /main/corerun 1048576 512 Asynchronous 721.451 us 40.7112 us 45.2504 us 730.462 us 632.137 us 818.367 us 1.00 0.00 4.4643 - - 35,479 B
ReadAsync Job-BAGWTC /pr/corerun 1048576 512 Asynchronous 1,091.716 us 70.6851 us 81.4010 us 1,112.973 us 917.899 us 1,205.433 us 1.53 0.14 4.8077 - - 56,053 B
WriteAsync Job-QPGETX /main/corerun 1048576 512 Asynchronous 4,796.827 us 436.7428 us 485.4384 us 4,771.958 us 4,106.877 us 5,630.695 us 1.00 0.00 - - - 33,331 B
WriteAsync Job-BAGWTC /pr/corerun 1048576 512 Asynchronous 5,470.590 us 327.2312 us 363.7166 us 5,408.549 us 4,782.366 us 6,275.705 us 1.15 0.14 - - - 49,775 B
Read Job-QPGETX /main/corerun 1048576 4096 None 291.232 us 80.9086 us 93.1745 us 275.141 us 187.374 us 503.463 us 1.00 0.00 - - - 264 B
Read Job-BAGWTC /pr/corerun 1048576 4096 None 334.109 us 68.0650 us 78.3837 us 337.590 us 215.847 us 446.806 us 1.20 0.26 - - - 312 B
Write Job-QPGETX /main/corerun 1048576 4096 None 4,607.837 us 746.3315 us 829.5455 us 4,341.023 us 3,525.470 us 6,231.949 us 1.00 0.00 - - - 271 B
Write Job-BAGWTC /pr/corerun 1048576 4096 None 24,002.911 us 6,093.4927 us 7,017.2753 us 25,402.684 us 5,415.475 us 33,483.806 us 5.48 2.15 - - - 339 B
ReadAsync Job-QPGETX /main/corerun 1048576 4096 None 713.696 us 63.2913 us 72.8863 us 717.152 us 607.976 us 853.725 us 1.00 0.00 2.9762 - - 29,276 B
ReadAsync Job-BAGWTC /pr/corerun 1048576 4096 None 605.516 us 47.2774 us 54.4448 us 609.381 us 538.396 us 744.988 us 0.86 0.11 - - - 756 B
WriteAsync Job-QPGETX /main/corerun 1048576 4096 None 6,578.191 us 1,095.7718 us 1,261.8925 us 6,220.224 us 4,957.093 us 9,751.148 us 1.00 0.00 - - - 29,288 B
WriteAsync Job-BAGWTC /pr/corerun 1048576 4096 None 4,791.675 us 369.3669 us 410.5503 us 4,700.800 us 4,099.328 us 5,881.630 us 0.74 0.16 - - - 813 B
Read Job-QPGETX /main/corerun 1048576 4096 Asynchronous 667.152 us 47.6134 us 54.8316 us 664.576 us 591.384 us 771.715 us 1.00 0.00 2.9762 - - 31,153 B
Read Job-BAGWTC /pr/corerun 1048576 4096 Asynchronous 221.857 us 19.0853 us 21.9786 us 213.092 us 193.838 us 266.605 us 0.33 0.04 - - - 312 B
Write Job-QPGETX /main/corerun 1048576 4096 Asynchronous 3,980.727 us 370.4189 us 396.3441 us 3,957.809 us 3,349.570 us 4,730.507 us 1.00 0.00 - - - 19,288 B
Write Job-BAGWTC /pr/corerun 1048576 4096 Asynchronous 6,262.792 us 6,252.7235 us 6,690.3441 us 2,651.381 us 2,079.099 us 21,867.644 us 1.61 1.78 - - - 317 B
ReadAsync Job-QPGETX /main/corerun 1048576 4096 Asynchronous 574.786 us 42.1783 us 48.5726 us 569.356 us 478.921 us 646.506 us 1.00 0.00 4.0323 - - 31,354 B
ReadAsync Job-BAGWTC /pr/corerun 1048576 4096 Asynchronous 599.043 us 61.3204 us 70.6167 us 580.360 us 513.933 us 751.406 us 1.05 0.17 - - - 754 B
WriteAsync Job-QPGETX /main/corerun 1048576 4096 Asynchronous 4,846.933 us 458.6288 us 470.9780 us 4,990.255 us 3,684.055 us 5,555.314 us 1.00 0.00 - - - 19,103 B
WriteAsync Job-BAGWTC /pr/corerun 1048576 4096 Asynchronous 4,444.319 us 436.1178 us 484.7438 us 4,336.010 us 3,632.459 us 5,540.288 us 0.92 0.13 - - - 804 B
Read_NoBuffering Job-QPGETX /main/corerun 1048576 16384 None 91.605 us 3.8155 us 4.2409 us 91.474 us 85.531 us 100.839 us 1.00 0.00 - - - 264 B
Read_NoBuffering Job-BAGWTC /pr/corerun 1048576 16384 None 89.649 us 4.0027 us 4.4490 us 88.851 us 83.412 us 98.799 us 0.98 0.06 - - - 248 B
Write_NoBuffering Job-QPGETX /main/corerun 1048576 16384 None 3,030.421 us 411.9500 us 457.8813 us 2,890.191 us 2,457.090 us 3,926.457 us 1.00 0.00 - - - 268 B
Write_NoBuffering Job-BAGWTC /pr/corerun 1048576 16384 None 3,190.733 us 476.3798 us 529.4949 us 3,125.416 us 2,519.836 us 4,427.951 us 1.08 0.26 - - - 253 B
ReadAsync_NoBuffering Job-QPGETX /main/corerun 1048576 16384 None 216.910 us 10.3131 us 10.5908 us 216.302 us 194.176 us 230.152 us 1.00 0.00 - - - 7,769 B
ReadAsync_NoBuffering Job-BAGWTC /pr/corerun 1048576 16384 None 194.662 us 4.7074 us 4.8342 us 195.164 us 187.065 us 204.551 us 0.90 0.06 - - - 601 B
WriteAsync_NoBuffering Job-QPGETX /main/corerun 1048576 16384 None 3,825.778 us 451.5085 us 519.9578 us 3,924.552 us 2,846.575 us 4,697.095 us 1.00 0.00 - - - 7,778 B
WriteAsync_NoBuffering Job-BAGWTC /pr/corerun 1048576 16384 None 3,784.943 us 269.1751 us 309.9824 us 3,754.963 us 3,212.023 us 4,566.550 us 1.01 0.17 - - - 651 B
Read_NoBuffering Job-QPGETX /main/corerun 1048576 16384 Asynchronous 237.765 us 15.7084 us 16.8078 us 235.056 us 215.272 us 273.018 us 1.00 0.00 1.0081 - - 8,082 B
Read_NoBuffering Job-BAGWTC /pr/corerun 1048576 16384 Asynchronous 94.289 us 3.6132 us 4.1610 us 94.142 us 84.586 us 101.156 us 0.40 0.03 - - - 248 B
Write_NoBuffering Job-QPGETX /main/corerun 1048576 16384 Asynchronous 4,665.512 us 342.8943 us 394.8775 us 4,654.113 us 4,137.129 us 5,534.271 us 1.00 0.00 - - - 8,341 B
Write_NoBuffering Job-BAGWTC /pr/corerun 1048576 16384 Asynchronous 3,010.067 us 291.1990 us 335.3452 us 3,106.774 us 2,197.075 us 3,431.360 us 0.65 0.10 - - - 252 B
ReadAsync_NoBuffering Job-QPGETX /main/corerun 1048576 16384 Asynchronous 210.353 us 13.6612 us 15.7323 us 209.226 us 187.863 us 238.718 us 1.00 0.00 0.7530 - - 8,313 B
ReadAsync_NoBuffering Job-BAGWTC /pr/corerun 1048576 16384 Asynchronous 194.484 us 8.0280 us 9.2451 us 194.840 us 172.108 us 211.183 us 0.93 0.07 - - - 601 B
WriteAsync_NoBuffering Job-QPGETX /main/corerun 1048576 16384 Asynchronous 3,714.112 us 360.9967 us 401.2468 us 3,628.559 us 3,082.772 us 4,383.092 us 1.00 0.00 - - - 7,811 B
WriteAsync_NoBuffering Job-BAGWTC /pr/corerun 1048576 16384 Asynchronous 3,916.907 us 421.5212 us 468.5197 us 4,013.152 us 3,095.734 us 4,838.514 us 1.06 0.13 - - - 651 B
CopyToFile Job-QPGETX /main/corerun 1048576 ? None 2,306.942 us 359.6185 us 399.7150 us 2,300.537 us 1,761.403 us 3,216.894 us 1.00 0.00 - - - 531 B
CopyToFile Job-BAGWTC /pr/corerun 1048576 ? None 2,957.474 us 230.7856 us 265.7731 us 2,982.680 us 2,324.295 us 3,396.686 us 1.33 0.20 - - - 628 B
CopyToFileAsync Job-QPGETX /main/corerun 1048576 ? None 3,326.559 us 238.3014 us 274.4283 us 3,334.431 us 2,831.326 us 3,915.690 us 1.00 0.00 - - - 2,993 B
CopyToFileAsync Job-BAGWTC /pr/corerun 1048576 ? None 3,770.375 us 394.1241 us 453.8739 us 3,877.305 us 2,999.828 us 4,642.659 us 1.14 0.17 - - - 1,595 B
CopyToFileAsync Job-QPGETX /main/corerun 1048576 ? Asynchronous 3,598.849 us 309.0315 us 355.8811 us 3,613.892 us 2,984.037 us 4,393.462 us 1.00 0.00 - - - 3,129 B
CopyToFileAsync Job-BAGWTC /pr/corerun 1048576 ? Asynchronous 3,393.550 us 391.0080 us 450.2853 us 3,275.451 us 2,751.701 us 4,354.110 us 0.95 0.17 - - - 1,593 B
Read Job-QPGETX /main/corerun 104857600 4096 None 23,399.903 us 834.0666 us 856.5250 us 23,489.900 us 22,096.018 us 25,471.955 us 1.00 0.00 - - - 405 B
Read Job-BAGWTC /pr/corerun 104857600 4096 None 25,942.834 us 1,061.8781 us 1,222.8605 us 26,042.000 us 23,802.590 us 28,164.680 us 1.12 0.07 - - - 458 B
Write Job-QPGETX /main/corerun 104857600 4096 None 144,779.567 us 4,175.8159 us 4,468.0763 us 144,988.600 us 138,288.200 us 153,266.100 us 1.00 0.00 - - - 696 B
Write Job-BAGWTC /pr/corerun 104857600 4096 None 217,093.263 us 44,556.4565 us 51,311.2816 us 228,892.650 us 140,116.700 us 281,122.450 us 1.46 0.36 - - - 1,592 B
ReadAsync Job-QPGETX /main/corerun 104857600 4096 None 42,119.799 us 1,720.7047 us 1,981.5661 us 42,579.688 us 39,058.550 us 45,355.750 us 1.00 0.00 250.0000 - - 2,867,980 B
ReadAsync Job-BAGWTC /pr/corerun 104857600 4096 None 42,079.027 us 2,144.9324 us 2,470.1073 us 41,417.613 us 38,495.975 us 48,569.850 us 1.00 0.06 - - - 1,076 B
WriteAsync Job-QPGETX /main/corerun 104857600 4096 None 179,400.611 us 14,377.4046 us 15,383.6619 us 181,689.300 us 134,568.500 us 203,965.200 us 1.00 0.00 - - - 2,868,856 B
WriteAsync Job-BAGWTC /pr/corerun 104857600 4096 None 170,888.637 us 8,382.4656 us 9,317.0883 us 168,337.300 us 158,813.900 us 191,886.800 us 0.96 0.12 - - - 1,880 B
Read Job-QPGETX /main/corerun 104857600 4096 Asynchronous 63,218.862 us 2,640.5985 us 2,935.0182 us 62,718.000 us 58,924.900 us 70,179.100 us 1.00 0.00 250.0000 - - 3,075,958 B
Read Job-BAGWTC /pr/corerun 104857600 4096 Asynchronous 23,423.308 us 948.4075 us 1,092.1875 us 23,362.044 us 21,885.400 us 25,699.633 us 0.37 0.03 - - - 595 B
Write Job-QPGETX /main/corerun 104857600 4096 Asynchronous 199,284.595 us 8,736.9244 us 9,711.0684 us 199,444.500 us 180,959.900 us 215,530.000 us 1.00 0.00 - - - 1,461,960 B
Write Job-BAGWTC /pr/corerun 104857600 4096 Asynchronous 213,061.720 us 46,212.1040 us 53,217.9277 us 234,001.475 us 137,021.750 us 296,714.900 us 1.07 0.29 - - - 1,592 B
ReadAsync Job-QPGETX /main/corerun 104857600 4096 Asynchronous 43,653.359 us 2,655.4463 us 3,058.0160 us 44,046.575 us 39,986.850 us 50,211.725 us 1.00 0.00 250.0000 - - 3,072,812 B
ReadAsync Job-BAGWTC /pr/corerun 104857600 4096 Asynchronous 41,947.446 us 1,406.6135 us 1,619.8582 us 42,051.088 us 39,788.050 us 45,277.500 us 0.96 0.07 - - - 1,076 B
WriteAsync Job-QPGETX /main/corerun 104857600 4096 Asynchronous 166,271.189 us 12,416.3049 us 13,800.6900 us 167,172.100 us 123,793.900 us 189,544.200 us 1.00 0.00 - - - 1,441,264 B
WriteAsync Job-BAGWTC /pr/corerun 104857600 4096 Asynchronous 171,520.650 us 6,832.9447 us 7,311.1743 us 171,350.450 us 153,063.900 us 184,628.900 us 1.04 0.11 - - - 1,880 B
Read_NoBuffering Job-QPGETX /main/corerun 104857600 16384 None 13,984.887 us 391.3896 us 450.7248 us 13,923.414 us 13,196.639 us 15,009.794 us 1.00 0.00 - - - 350 B
Read_NoBuffering Job-BAGWTC /pr/corerun 104857600 16384 None 13,053.314 us 425.6564 us 490.1865 us 12,912.739 us 12,368.439 us 14,252.900 us 0.93 0.05 - - - 334 B
Write_NoBuffering Job-QPGETX /main/corerun 104857600 16384 None 196,158.325 us 56,483.1831 us 65,046.1177 us 165,497.125 us 125,623.650 us 303,497.550 us 1.00 0.00 - - - 1,540 B
Write_NoBuffering Job-BAGWTC /pr/corerun 104857600 16384 None 182,091.735 us 46,916.3716 us 54,028.9633 us 171,445.350 us 125,516.500 us 265,289.950 us 1.03 0.42 - - - 1,548 B
ReadAsync_NoBuffering Job-QPGETX /main/corerun 104857600 16384 None 19,629.685 us 906.3963 us 1,007.4571 us 19,855.200 us 18,411.733 us 21,551.067 us 1.00 0.00 111.1111 - - 717,480 B
ReadAsync_NoBuffering Job-BAGWTC /pr/corerun 104857600 16384 None 17,475.076 us 467.3154 us 519.4198 us 17,475.429 us 16,593.207 us 18,284.829 us 0.89 0.05 - - - 741 B
WriteAsync_NoBuffering Job-QPGETX /main/corerun 104857600 16384 None 149,897.218 us 5,214.1471 us 5,354.5452 us 149,634.000 us 143,423.600 us 163,409.000 us 1.00 0.00 - - - 718,456 B
WriteAsync_NoBuffering Job-BAGWTC /pr/corerun 104857600 16384 None 188,994.622 us 40,928.8802 us 47,133.7593 us 184,113.150 us 135,145.100 us 259,066.100 us 1.24 0.34 - - - 2,120 B
Read_NoBuffering Job-QPGETX /main/corerun 104857600 16384 Asynchronous 25,433.846 us 2,726.2854 us 2,917.0948 us 25,054.110 us 21,834.970 us 32,484.470 us 1.00 0.00 100.0000 - - 770,022 B
Read_NoBuffering Job-BAGWTC /pr/corerun 104857600 16384 Asynchronous 13,445.746 us 1,009.9237 us 1,122.5275 us 13,422.230 us 11,888.660 us 15,950.975 us 0.54 0.07 - - - 326 B
Write_NoBuffering Job-QPGETX /main/corerun 104857600 16384 Asynchronous 158,956.821 us 11,724.0564 us 13,031.2577 us 158,849.100 us 140,548.000 us 189,603.300 us 1.00 0.00 - - - 741,152 B
Write_NoBuffering Job-BAGWTC /pr/corerun 104857600 16384 Asynchronous 206,453.075 us 44,082.4809 us 50,765.4506 us 219,365.775 us 128,252.800 us 272,652.350 us 1.30 0.38 - - - 1,548 B
ReadAsync_NoBuffering Job-QPGETX /main/corerun 104857600 16384 Asynchronous 17,817.295 us 335.2129 us 344.2389 us 17,894.800 us 17,063.333 us 18,338.617 us 1.00 0.00 83.3333 - - 769,128 B
ReadAsync_NoBuffering Job-BAGWTC /pr/corerun 104857600 16384 Asynchronous 16,499.864 us 456.8564 us 507.7947 us 16,492.793 us 15,673.807 us 17,467.100 us 0.92 0.03 - - - 782 B
WriteAsync_NoBuffering Job-QPGETX /main/corerun 104857600 16384 Asynchronous 197,024.280 us 47,985.4471 us 55,260.1122 us 193,331.200 us 120,682.150 us 278,943.150 us 1.00 0.00 - - - 718,748 B
WriteAsync_NoBuffering Job-BAGWTC /pr/corerun 104857600 16384 Asynchronous 196,696.003 us 42,409.1720 us 48,838.4656 us 193,615.500 us 136,827.100 us 279,858.950 us 1.02 0.17 - - - 2,120 B
CopyToFile Job-QPGETX /main/corerun 104857600 ? None 220,226.888 us 33,018.6894 us 38,024.3718 us 223,760.800 us 158,415.200 us 280,972.300 us 1.00 0.00 - - - 1,692 B
CopyToFile Job-BAGWTC /pr/corerun 104857600 ? None 238,110.705 us 43,490.6919 us 50,083.9455 us 254,081.950 us 139,455.100 us 291,811.300 us 1.11 0.30 - - - 1,812 B
CopyToFileAsync Job-QPGETX /main/corerun 104857600 ? None 226,310.170 us 41,002.0146 us 47,217.9810 us 197,836.600 us 179,116.900 us 297,272.000 us 1.00 0.00 - - - 181,288 B
CopyToFileAsync Job-BAGWTC /pr/corerun 104857600 ? None 334,515.905 us 18,842.5946 us 21,699.1600 us 331,268.850 us 302,936.800 us 376,991.500 us 1.52 0.24 - - - 4,520 B
CopyToFileAsync Job-QPGETX /main/corerun 104857600 ? Asynchronous 203,847.025 us 33,754.7055 us 38,871.9690 us 182,818.100 us 159,513.900 us 265,586.400 us 1.00 0.00 - - - 187,760 B
CopyToFileAsync Job-BAGWTC /pr/corerun 104857600 ? Asynchronous 254,340.800 us 36,762.8850 us 42,336.1930 us 260,538.000 us 169,910.200 us 319,177.900 us 1.27 0.24 - - - 2,480 B

@stephentoub stephentoub force-pushed the unixfilestreamstrategy branch 2 times, most recently from 9980217 to 1543ec2 Compare July 7, 2021 02:46
@adamsitnik
Copy link
Member

I've run the benchmarks on my Ubuntu 18.04 machine (not a VM, bare metal with SSD drive) using the commit from 10h ago using 100 iterations and no outliers removal (to have a LOT of samples and full distribution) which took 1.15h.

--minIterationCount 100 --maxIterationCount 101 --outliers dontremove

And it looks good to me! SeekBackward is slightly slower (because we can't cache file length on Unix as locking is just advisory there), while SeekForward is 25x faster (because we just store the position in memory). Similarly to Windows rewrite FlushAsync is two times slower, mostly because for BufferedFileStreamStrategy it's 100% async. There is a lot of allocation wins for the async implementation!

 BenchmarkDotNet=v0.13.0.1559-nightly, OS=ubuntu 18.04
 Intel Xeon CPU E5-1650 v4 3.60GHz, 1 CPU, 12 logical and 6 physical cores
 .NET SDK=6.0.100-preview.7.21356.4
   [Host]     : .NET 6.0.0 (6.0.21.35602), X64 RyuJIT
   Job-BUSLRH : .NET 6.0.0 (42.42.42.42424), X64 RyuJIT
   Job-VCXHFI : .NET 6.0.0 (42.42.42.42424), X64 RyuJIT
Method Toolchain fileSize userBufferSize options Mean Ratio Allocated
Read /pr/corerun 1024 1024 None 6.416 us 1.07 4,432 B
Read /main/corerun 1024 1024 None 6.025 us 1.00 4,392 B
Write /pr/corerun 1024 1024 None 33.733 us 1.00 4,432 B
Write /main/corerun 1024 1024 None 33.764 us 1.00 4,392 B
ReadAsync /pr/corerun 1024 1024 None 9.636 us 0.98 5,008 B
ReadAsync /main/corerun 1024 1024 None 9.821 us 1.00 4,776 B
WriteAsync /pr/corerun 1024 1024 None 34.357 us 0.91 4,520 B
WriteAsync /main/corerun 1024 1024 None 38.010 us 1.00 4,839 B
Read /pr/corerun 1024 1024 Asynchronous 6.387 us 0.74 4,432 B
Read /main/corerun 1024 1024 Asynchronous 8.643 us 1.00 4,632 B
Write /pr/corerun 1024 1024 Asynchronous 33.341 us 0.96 4,432 B
Write /main/corerun 1024 1024 Asynchronous 34.911 us 1.00 4,512 B
ReadAsync /pr/corerun 1024 1024 Asynchronous 9.514 us 0.99 5,008 B
ReadAsync /main/corerun 1024 1024 Asynchronous 9.635 us 1.00 4,818 B
WriteAsync /pr/corerun 1024 1024 Asynchronous 33.711 us 0.98 4,520 B
WriteAsync /main/corerun 1024 1024 Asynchronous 34.237 us 1.00 4,512 B
OpenClose /pr/corerun 1024 ? None 3.824 us 0.98 312 B
OpenClose /main/corerun 1024 ? None 3.901 us 1.00 272 B
LockUnlock /pr/corerun 1024 ? None 6.318 us 0.99 312 B
LockUnlock /main/corerun 1024 ? None 6.396 us 1.00 272 B
SeekForward /pr/corerun 1024 ? None 19.521 us 0.04 312 B
SeekForward /main/corerun 1024 ? None 443.746 us 1.00 273 B
SeekBackward /pr/corerun 1024 ? None 517.294 us 1.15 313 B
SeekBackward /main/corerun 1024 ? None 450.790 us 1.00 273 B
ReadByte /pr/corerun 1024 ? None 9.640 us 0.93 4,432 B
ReadByte /main/corerun 1024 ? None 10.329 us 1.00 4,392 B
WriteByte /pr/corerun 1024 ? None 35.861 us 0.96 4,432 B
WriteByte /main/corerun 1024 ? None 37.339 us 1.00 4,392 B
Flush /pr/corerun 1024 ? None 1,529.077 us 1.02 4,434 B
Flush /main/corerun 1024 ? None 1,493.796 us 1.00 4,395 B
FlushAsync /pr/corerun 1024 ? None 3,189.850 us 2.13 160,527 B
FlushAsync /main/corerun 1024 ? None 1,495.268 us 1.00 4,394 B
CopyToFile /pr/corerun 1024 ? None 39.144 us 1.01 4,744 B
CopyToFile /main/corerun 1024 ? None 38.930 us 1.00 8,784 B
CopyToFileAsync /pr/corerun 1024 ? None 84.709 us 0.84 5,560 B
CopyToFileAsync /main/corerun 1024 ? None 100.404 us 1.00 9,672 B
OpenClose /pr/corerun 1024 ? Asynchronous 3.705 us 0.92 312 B
OpenClose /main/corerun 1024 ? Asynchronous 4.033 us 1.00 392 B
LockUnlock /pr/corerun 1024 ? Asynchronous 6.388 us 0.99 312 B
LockUnlock /main/corerun 1024 ? Asynchronous 6.447 us 1.00 392 B
SeekForward /pr/corerun 1024 ? Asynchronous 19.844 us 0.04 312 B
SeekForward /main/corerun 1024 ? Asynchronous 444.649 us 1.00 393 B
SeekBackward /pr/corerun 1024 ? Asynchronous 519.951 us 1.18 313 B
SeekBackward /main/corerun 1024 ? Asynchronous 441.413 us 1.00 393 B
ReadByte /pr/corerun 1024 ? Asynchronous 9.730 us 0.92 4,432 B
ReadByte /main/corerun 1024 ? Asynchronous 10.631 us 1.00 4,512 B
WriteByte /pr/corerun 1024 ? Asynchronous 35.854 us 0.94 4,432 B
WriteByte /main/corerun 1024 ? Asynchronous 38.265 us 1.00 4,512 B
Flush /pr/corerun 1024 ? Asynchronous 1,485.757 us 1.00 4,434 B
Flush /main/corerun 1024 ? Asynchronous 1,486.036 us 1.00 4,514 B
FlushAsync /pr/corerun 1024 ? Asynchronous 3,239.967 us 2.16 160,526 B
FlushAsync /main/corerun 1024 ? Asynchronous 1,501.255 us 1.00 4,514 B
CopyToFileAsync /pr/corerun 1024 ? Asynchronous 86.263 us 0.95 5,560 B
CopyToFileAsync /main/corerun 1024 ? Asynchronous 90.828 us 1.00 9,640 B
Read /pr/corerun 1048576 512 None 247.189 us 1.04 4,432 B
Read /main/corerun 1048576 512 None 237.486 us 1.00 4,392 B
Write /pr/corerun 1048576 512 None 1,207.718 us 1.00 4,434 B
Write /main/corerun 1048576 512 None 1,206.753 us 1.00 4,394 B
ReadAsync /pr/corerun 1048576 512 None 721.925 us 0.25 56,073 B
ReadAsync /main/corerun 1048576 512 None 2,940.302 us 1.00 234,114 B
WriteAsync /pr/corerun 1048576 512 None 2,348.989 us 0.46 49,800 B
WriteAsync /main/corerun 1048576 512 None 5,066.171 us 1.00 234,117 B
Read /pr/corerun 1048576 512 Asynchronous 246.466 us 0.30 4,432 B
Read /main/corerun 1048576 512 Asynchronous 808.704 us 1.00 35,307 B
Write /pr/corerun 1048576 512 Asynchronous 1,214.645 us 0.59 4,434 B
Write /main/corerun 1048576 512 Asynchronous 2,049.666 us 1.00 33,221 B
ReadAsync /pr/corerun 1048576 512 Asynchronous 749.090 us 1.21 56,073 B
ReadAsync /main/corerun 1048576 512 Asynchronous 622.242 us 1.00 35,482 B
WriteAsync /pr/corerun 1048576 512 Asynchronous 2,438.205 us 1.14 49,799 B
WriteAsync /main/corerun 1048576 512 Asynchronous 2,135.728 us 1.00 33,326 B
Read /pr/corerun 1048576 4096 None 196.300 us 1.00 312 B
Read /main/corerun 1048576 4096 None 196.261 us 1.00 272 B
Write /pr/corerun 1048576 4096 None 1,146.589 us 0.99 314 B
Write /main/corerun 1048576 4096 None 1,155.701 us 1.00 274 B
ReadAsync /pr/corerun 1048576 4096 None 395.510 us 0.93 753 B
ReadAsync /main/corerun 1048576 4096 None 426.427 us 1.00 29,281 B
WriteAsync /pr/corerun 1048576 4096 None 1,887.500 us 0.97 797 B
WriteAsync /main/corerun 1048576 4096 None 1,954.203 us 1.00 29,285 B
Read /pr/corerun 1048576 4096 Asynchronous 193.996 us 0.35 312 B
Read /main/corerun 1048576 4096 Asynchronous 551.382 us 1.00 31,114 B
Write /pr/corerun 1048576 4096 Asynchronous 1,143.294 us 0.65 314 B
Write /main/corerun 1048576 4096 Asynchronous 1,769.554 us 1.00 19,724 B
ReadAsync /pr/corerun 1048576 4096 Asynchronous 392.859 us 0.91 753 B
ReadAsync /main/corerun 1048576 4096 Asynchronous 431.722 us 1.00 31,361 B
WriteAsync /pr/corerun 1048576 4096 Asynchronous 1,916.619 us 1.05 797 B
WriteAsync /main/corerun 1048576 4096 Asynchronous 1,827.265 us 1.00 19,101 B
Read_NoBuffering /pr/corerun 1048576 16384 None 97.851 us 1.00 248 B
Read_NoBuffering /main/corerun 1048576 16384 None 98.107 us 1.00 272 B
Write_NoBuffering /pr/corerun 1048576 16384 None 1,083.664 us 1.01 250 B
Write_NoBuffering /main/corerun 1048576 16384 None 1,078.379 us 1.00 274 B
ReadAsync_NoBuffering /pr/corerun 1048576 16384 None 156.729 us 0.90 600 B
ReadAsync_NoBuffering /main/corerun 1048576 16384 None 174.278 us 1.00 7,777 B
WriteAsync_NoBuffering /pr/corerun 1048576 16384 None 1,504.483 us 1.00 644 B
WriteAsync_NoBuffering /main/corerun 1048576 16384 None 1,506.338 us 1.00 7,780 B
Read_NoBuffering /pr/corerun 1048576 16384 Asynchronous 96.303 us 0.47 248 B
Read_NoBuffering /main/corerun 1048576 16384 Asynchronous 204.124 us 1.00 8,073 B
Write_NoBuffering /pr/corerun 1048576 16384 Asynchronous 1,071.900 us 0.74 250 B
Write_NoBuffering /main/corerun 1048576 16384 Asynchronous 1,454.374 us 1.00 8,757 B
ReadAsync_NoBuffering /pr/corerun 1048576 16384 Asynchronous 156.961 us 0.89 600 B
ReadAsync_NoBuffering /main/corerun 1048576 16384 Asynchronous 175.874 us 1.00 8,321 B
WriteAsync_NoBuffering /pr/corerun 1048576 16384 Asynchronous 1,505.395 us 0.98 644 B
WriteAsync_NoBuffering /main/corerun 1048576 16384 Asynchronous 1,545.705 us 1.00 7,812 B
CopyToFile /pr/corerun 1048576 ? None 1,105.359 us 1.00 626 B
CopyToFile /main/corerun 1048576 ? None 1,107.982 us 1.00 546 B
CopyToFileAsync /pr/corerun 1048576 ? None 1,726.333 us 1.05 1,588 B
CopyToFileAsync /main/corerun 1048576 ? None 1,644.275 us 1.00 3,004 B
CopyToFileAsync /pr/corerun 1048576 ? Asynchronous 1,739.108 us 1.04 1,588 B
CopyToFileAsync /main/corerun 1048576 ? Asynchronous 1,687.384 us 1.00 3,140 B
Read /pr/corerun 104857600 4096 None 26,761.720 us 0.99 360 B
Read /main/corerun 104857600 4096 None 27,150.873 us 1.00 320 B
Write /pr/corerun 104857600 4096 None 117,778.592 us 1.00 528 B
Write /main/corerun 104857600 4096 None 118,354.775 us 1.00 488 B
ReadAsync /pr/corerun 104857600 4096 None 45,089.878 us 0.95 1,076 B
ReadAsync /main/corerun 104857600 4096 None 47,512.244 us 1.00 2,867,988 B
WriteAsync /pr/corerun 104857600 4096 None 149,047.259 us 0.95 1,440 B
WriteAsync /main/corerun 104857600 4096 None 156,469.046 us 1.00 2,868,456 B
Read /pr/corerun 104857600 4096 Asynchronous 26,635.537 us 0.42 360 B
Read /main/corerun 104857600 4096 Asynchronous 63,528.340 us 1.00 3,072,588 B
Write /pr/corerun 104857600 4096 Asynchronous 123,505.133 us 0.76 528 B
Write /main/corerun 104857600 4096 Asynchronous 163,149.767 us 1.00 1,467,944 B
ReadAsync /pr/corerun 104857600 4096 Asynchronous 44,981.457 us 0.95 1,076 B
ReadAsync /main/corerun 104857600 4096 Asynchronous 47,548.427 us 1.00 3,072,820 B
WriteAsync /pr/corerun 104857600 4096 Asynchronous 158,313.373 us 0.98 2,088 B
WriteAsync /main/corerun 104857600 4096 Asynchronous 162,548.465 us 1.00 1,438,504 B
Read_NoBuffering /pr/corerun 104857600 16384 None 16,903.187 us 0.99 279 B
Read_NoBuffering /main/corerun 104857600 16384 None 17,038.535 us 1.00 303 B
Write_NoBuffering /pr/corerun 104857600 16384 None 109,261.127 us 1.03 464 B
Write_NoBuffering /main/corerun 104857600 16384 None 105,745.229 us 1.00 380 B
ReadAsync_NoBuffering /pr/corerun 104857600 16384 None 21,256.015 us 0.95 718 B
ReadAsync_NoBuffering /main/corerun 104857600 16384 None 22,455.891 us 1.00 717,488 B
WriteAsync_NoBuffering /pr/corerun 104857600 16384 None 122,727.605 us 0.98 1,288 B
WriteAsync_NoBuffering /main/corerun 104857600 16384 None 124,919.921 us 1.00 718,056 B
Read_NoBuffering /pr/corerun 104857600 16384 Asynchronous 16,699.216 us 0.60 279 B
Read_NoBuffering /main/corerun 104857600 16384 Asynchronous 27,769.229 us 1.00 768,536 B
Write_NoBuffering /pr/corerun 104857600 16384 Asynchronous 106,675.516 us 0.83 356 B
Write_NoBuffering /main/corerun 104857600 16384 Asynchronous 129,051.569 us 1.00 829,292 B
ReadAsync_NoBuffering /pr/corerun 104857600 16384 Asynchronous 21,172.322 us 0.93 730 B
ReadAsync_NoBuffering /main/corerun 104857600 16384 Asynchronous 22,811.289 us 1.00 768,784 B
WriteAsync_NoBuffering /pr/corerun 104857600 16384 Asynchronous 126,101.103 us 1.02 1,288 B
WriteAsync_NoBuffering /main/corerun 104857600 16384 Asynchronous 124,090.440 us 1.00 718,088 B
CopyToFile /pr/corerun 104857600 ? None 116,412.401 us 0.99 840 B
CopyToFile /main/corerun 104857600 ? None 117,249.618 us 1.00 760 B
CopyToFileAsync /pr/corerun 104857600 ? None 140,607.107 us 0.98 2,088 B
CopyToFileAsync /main/corerun 104857600 ? None 143,821.861 us 1.00 180,768 B
CopyToFileAsync /pr/corerun 104857600 ? Asynchronous 142,692.801 us 1.01 2,232 B
CopyToFileAsync /main/corerun 104857600 ? Asynchronous 141,688.091 us 1.00 187,528 B

@adamsitnik
Copy link
Member

It seems that the CI failures come from this assert:

https://github.com/dotnet/runtime/blob/1543ec25c7a746c35c919aec0f33b828774d60d6/src/libraries/System.Private.CoreLib/src/System/IO/Strategies/OSFileStreamStrategy.cs#L108-L110

And we just need to not set the cached length for non Windows OS:
https://github.com/dotnet/runtime/blob/1543ec25c7a746c35c919aec0f33b828774d60d6/src/libraries/System.Private.CoreLib/src/System/IO/Strategies/OSFileStreamStrategy.cs#L238

but since you have not modified this line of code, I don't know how to use GitHub UI to provide a suggestion for it

Copy link
Member

@adamsitnik adamsitnik left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, again big thanks for the PR @stephentoub !

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
area-System.IO tenet-performance Performance related issue
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Implement new FileStreamStrategy for Unix
2 participants