Skip to content

Add UnixFileStreamStrategy - #55191

Merged
stephentoub merged 3 commits into
dotnet:mainfrom
stephentoub:unixfilestreamstrategy
Jul 8, 2021
Merged

Add UnixFileStreamStrategy#55191
stephentoub merged 3 commits into
dotnet:mainfrom
stephentoub:unixfilestreamstrategy

Conversation

@stephentoub

Copy link
Copy Markdown
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

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

ghost commented Jul 6, 2021

Copy link
Copy Markdown

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

@adamsitnikadamsitnik left a comment

Copy link
Copy Markdown
Member

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>

Comment threadsrc/libraries/System.Private.CoreLib/src/System/IO/RandomAccess.Unix.cs Outdated
@adamsitnik

Copy link
Copy Markdown
Member

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

@stephentoub
stephentoubforce-pushed the unixfilestreamstrategy branch from a6b4540 to ea8ca67CompareJuly 6, 2021 15:53
@stephentoub

Copy link
Copy Markdown
MemberAuthor

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

Fasterbase/diffBase Median (ns)Diff Median (ns)Modality
System.IO.Tests.Perf_FileStream.SeekForward(fileSize: 1024, options: Asynchronou26.53448831.4316918.17
System.IO.Tests.Perf_FileStream.SeekForward(fileSize: 1024, options: None)25.64448720.4517498.99
System.IO.Tests.Perf_FileStream.ReadAsync(fileSize: 1048576, userBufferSize: 5123.412745570.00804766.12
System.IO.Tests.Perf_FileStream.Read(fileSize: 1048576, userBufferSize: 512, opt3.28699269.29213067.40
System.IO.Tests.Perf_FileStream.Read(fileSize: 1048576, userBufferSize: 4096, op2.90483398.96166835.70
System.IO.Tests.Perf_FileStream.Read_NoBuffering(fileSize: 1048576, userBufferSi2.23184168.6882750.74
System.IO.Tests.Perf_FileStream.Read(fileSize: 104857600, userBufferSize: 4096,2.1853781400.0024664255.00
System.IO.Tests.Perf_FileStream.Read_NoBuffering(fileSize: 104857600, userBuffer1.5824856100.0015689533.33
System.IO.Tests.Perf_FileStream.WriteAsync(fileSize: 1048576, userBufferSize: 511.475678831.253858899.22
System.IO.Tests.Perf_FileStream.ReadAsync_NoBuffering(fileSize: 1048576, userBuf1.41213015.79151455.26
System.IO.Tests.Perf_FileStream.WriteAsync(fileSize: 1024, userBufferSize: 1024,1.41212876.56151459.99
System.IO.Tests.Perf_FileStream.Write_NoBuffering(fileSize: 1048576, userBufferS1.403391434.382414748.96
System.IO.Tests.Perf_FileStream.Write(fileSize: 1048576, userBufferSize: 512, op1.383757940.632727214.29
System.IO.Tests.Perf_FileStream.Write(fileSize: 1048576, userBufferSize: 4096, o1.333372741.252533917.71
System.IO.Tests.Perf_FileStream.Read(fileSize: 1024, userBufferSize: 1024, optio1.317252.835519.34
System.IO.Tests.Perf_FileStream.Write_NoBuffering(fileSize: 104857600, userBuffe1.19207185100.00174002900.00bimodal
System.IO.Tests.Perf_FileStream.ReadAsync_NoBuffering(fileSize: 1048576, userBuf1.17195840.47167346.40bimodal
System.IO.Tests.Perf_FileStream.Write(fileSize: 104857600, userBufferSize: 4096,1.17212842500.00181985400.00
System.IO.Tests.Perf_FileStream.Write_NoBuffering(fileSize: 1048576, userBufferS1.142782944.792436131.25
System.IO.Tests.Perf_FileStream.ReadByte(fileSize: 1024, options: Asynchronous)1.139710.308577.47
System.IO.Tests.Perf_FileStream.ReadByte(fileSize: 1024, options: None)1.099465.408676.82
System.IO.Tests.Perf_FileStream.ReadAsync(fileSize: 104857600, userBufferSize: 41.0642139600.0039679587.50
Slowerdiff/baseBase Median (ns)Diff Median (ns)Modality
System.IO.Tests.Perf_FileStream.FlushAsync(fileSize: 1024, options: None)2.201444209.663178962.50
System.IO.Tests.Perf_FileStream.FlushAsync(fileSize: 1024, options: Asynchronous2.081433528.982981252.50
System.IO.Tests.Perf_FileStream.WriteAsync(fileSize: 1048576, userBufferSize: 401.462400020.093504236.88several?
System.IO.Tests.Perf_FileStream.WriteAsync(fileSize: 1048576, userBufferSize: 511.322891966.883819548.44
System.IO.Tests.Perf_FileStream.ReadAsync(fileSize: 1048576, userBufferSize: 5121.31651719.49853493.59
System.IO.Tests.Perf_FileStream.WriteAsync_NoBuffering(fileSize: 1048576, userBu1.252528863.133167388.75
System.IO.Tests.Perf_FileStream.WriteAsync(fileSize: 1048576, userBufferSize: 401.202927753.753518150.63
System.IO.Tests.Perf_FileStream.Write(fileSize: 1048576, userBufferSize: 512, op1.172283541.522678497.92several?
System.IO.Tests.Perf_FileStream.CopyToFile(fileSize: 1048576, options: None)1.152507296.882878378.65
System.IO.Tests.Perf_FileStream.ReadAsync(fileSize: 1048576, userBufferSize: 4091.14432771.27494837.68several?
System.IO.Tests.Perf_FileStream.WriteAsync(fileSize: 104857600, userBufferSize:1.12198299200.00222205800.00
System.IO.Tests.Perf_FileStream.Read_NoBuffering(fileSize: 104857600, userBuffer1.1114698708.8216320806.67
System.IO.Tests.Perf_FileStream.SeekBackward(fileSize: 1024, options: None)1.11447950.59495893.85
System.IO.Tests.Perf_FileStream.Write(fileSize: 104857600, userBufferSize: 4096,1.10170165200.00188027850.00
System.IO.Tests.Perf_FileStream.WriteAsync(fileSize: 104857600, userBufferSize:1.09205111800.00224078250.00
System.IO.Tests.Perf_FileStream.Read(fileSize: 1024, userBufferSize: 1024, optio1.095023.825470.61
System.IO.Tests.Perf_FileStream.SeekBackward(fileSize: 1024, options: Asynchrono1.09448502.50487023.44
System.IO.Tests.Perf_FileStream.Write(fileSize: 1024, userBufferSize: 1024, opti1.08141219.99152202.91

MethodJobToolchainfileSizeuserBufferSizeoptionsMeanErrorStdDevMedianMinMaxRatioRatioSDGen 0Gen 1Gen 2Allocated
ReadJob-QPGETX/main/corerun10241024None5.138 us0.0579 us0.0484 us5.139 us5.081 us5.218 us1.000.000.68570.3324-4,384 B
ReadJob-BAGWTC/pr/corerun10241024None5.410 us0.0880 us0.0823 us5.360 us5.334 us5.550 us1.050.020.68700.3435-4,432 B
WriteJob-QPGETX/main/corerun10241024None149.836 us4.8452 us5.5798 us150.599 us138.491 us158.668 us1.000.000.5896--4,384 B
WriteJob-BAGWTC/pr/corerun10241024None143.096 us2.7787 us2.7290 us142.495 us140.026 us148.631 us0.960.030.5896--4,432 B
ReadAsyncJob-QPGETX/main/corerun10241024None7.929 us0.1564 us0.1801 us7.894 us7.661 us8.333 us1.000.001.00700.5035-4,768 B
ReadAsyncJob-BAGWTC/pr/corerun10241024None7.993 us0.3182 us0.3664 us7.865 us7.565 us8.783 us1.010.050.78760.3780-5,008 B
WriteAsyncJob-QPGETX/main/corerun10241024None211.533 us4.2282 us4.6996 us211.947 us202.320 us221.871 us1.000.00---4,832 B
WriteAsyncJob-BAGWTC/pr/corerun10241024None142.699 us2.9520 us3.2812 us142.572 us135.747 us148.574 us0.670.020.5734--4,520 B
ReadJob-QPGETX/main/corerun10241024Asynchronous7.263 us0.1429 us0.1588 us7.235 us6.986 us7.611 us1.000.000.99070.4953-4,624 B
ReadJob-BAGWTC/pr/corerun10241024Asynchronous5.284 us0.1053 us0.0985 us5.276 us5.156 us5.454 us0.730.020.69730.3381-4,432 B
WriteJob-QPGETX/main/corerun10241024Asynchronous145.150 us3.9165 us4.5102 us145.183 us139.103 us155.263 us1.000.000.5631--4,504 B
WriteJob-BAGWTC/pr/corerun10241024Asynchronous149.928 us5.2243 us5.8068 us149.182 us140.819 us162.077 us1.040.050.5841--4,432 B
ReadAsyncJob-QPGETX/main/corerun10241024Asynchronous7.618 us0.1370 us0.1144 us7.602 us7.482 us7.868 us1.000.001.00390.4858-4,808 B
ReadAsyncJob-BAGWTC/pr/corerun10241024Asynchronous7.617 us0.0466 us0.0389 us7.608 us7.567 us7.696 us1.000.010.77080.3700-5,008 B
WriteAsyncJob-QPGETX/main/corerun10241024Asynchronous150.201 us3.8799 us4.4681 us151.724 us141.856 us155.483 us1.000.000.5734--4,504 B
WriteAsyncJob-BAGWTC/pr/corerun10241024Asynchronous140.539 us2.5148 us2.3524 us140.657 us137.313 us144.042 us0.940.040.5531--4,520 B
OpenCloseJob-QPGETX/main/corerun1024?None3.424 us0.0112 us0.0099 us3.424 us3.409 us3.444 us1.000.000.04120.0137-264 B
OpenCloseJob-BAGWTC/pr/corerun1024?None3.495 us0.0300 us0.0281 us3.486 us3.461 us3.551 us1.020.010.04170.0139-312 B
LockUnlockJob-QPGETX/main/corerun1024?None5.575 us0.0196 us0.0174 us5.577 us5.535 us5.602 us1.000.000.0222--264 B
LockUnlockJob-BAGWTC/pr/corerun1024?None6.024 us0.1177 us0.1101 us5.981 us5.887 us6.235 us1.080.020.04610.0231-312 B
SeekForwardJob-QPGETX/main/corerun1024?None449.980 us7.8513 us7.3441 us450.813 us436.381 us463.271 us1.000.00---265 B
SeekForwardJob-BAGWTC/pr/corerun1024?None17.356 us0.2963 us0.2771 us17.298 us17.001 us17.900 us0.040.00---312 B
SeekBackwardJob-QPGETX/main/corerun1024?None454.440 us1.7835 us1.6683 us454.302 us452.401 us457.656 us1.000.00---265 B
SeekBackwardJob-BAGWTC/pr/corerun1024?None498.374 us3.8069 us3.1789 us498.023 us492.054 us503.325 us1.100.01---313 B
ReadByteJob-QPGETX/main/corerun1024?None9.638 us0.2052 us0.2281 us9.683 us9.307 us10.021 us1.000.000.66450.3127-4,384 B
ReadByteJob-BAGWTC/pr/corerun1024?None8.690 us0.1883 us0.1933 us8.616 us8.409 us9.086 us0.900.020.68360.3238-4,432 B
WriteByteJob-QPGETX/main/corerun1024?None144.382 us14.7800 us16.4279 us143.020 us101.155 us172.095 us1.000.000.5580--4,384 B
WriteByteJob-BAGWTC/pr/corerun1024?None140.033 us9.2427 us10.6439 us142.418 us101.423 us148.904 us0.980.140.5531--4,432 B
FlushJob-QPGETX/main/corerun1024?None1,445.631 us24.1897 us21.4436 us1,442.204 us1,421.856 us1,488.463 us1.000.00---4,387 B
FlushJob-BAGWTC/pr/corerun1024?None1,427.810 us15.8460 us14.8224 us1,426.088 us1,399.275 us1,448.203 us0.990.02---4,435 B
FlushAsyncJob-QPGETX/main/corerun1024?None1,460.382 us23.2935 us21.7887 us1,464.585 us1,428.019 us1,501.792 us1.000.00---4,387 B
FlushAsyncJob-BAGWTC/pr/corerun1024?None3,035.240 us85.1788 us87.4723 us3,020.682 us2,932.185 us3,293.367 us2.080.0725.0000--160,495 B
CopyToFileJob-QPGETX/main/corerun1024?None150.521 us5.2368 us6.0307 us150.695 us141.094 us161.134 us1.000.001.25000.6250-8,768 B
CopyToFileJob-BAGWTC/pr/corerun1024?None149.819 us6.3749 us7.0857 us149.045 us142.419 us169.224 us1.000.050.6188--4,744 B
CopyToFileAsyncJob-QPGETX/main/corerun1024?None229.800 us4.4597 us4.5798 us231.209 us219.712 us234.873 us1.000.001.83820.9191-9,657 B
CopyToFileAsyncJob-BAGWTC/pr/corerun1024?None228.614 us4.4826 us4.1931 us228.240 us221.907 us235.688 us1.000.020.8681--5,560 B
OpenCloseJob-QPGETX/main/corerun1024?Asynchronous3.653 us0.0577 us0.0540 us3.653 us3.552 us3.723 us1.000.000.05850.0293-384 B
OpenCloseJob-BAGWTC/pr/corerun1024?Asynchronous3.558 us0.0405 us0.0359 us3.547 us3.520 us3.652 us0.970.020.04240.0141-312 B
LockUnlockJob-QPGETX/main/corerun1024?Asynchronous6.103 us0.0737 us0.0653 us6.104 us5.998 us6.239 us1.000.000.04890.0244-384 B
LockUnlockJob-BAGWTC/pr/corerun1024?Asynchronous5.900 us0.0689 us0.0538 us5.896 us5.833 us6.006 us0.960.010.04670.0234-312 B
SeekForwardJob-QPGETX/main/corerun1024?Asynchronous449.817 us7.0763 us6.6192 us449.298 us442.077 us464.869 us1.000.00---385 B
SeekForwardJob-BAGWTC/pr/corerun1024?Asynchronous17.237 us0.0696 us0.0651 us17.247 us17.118 us17.336 us0.040.00---312 B
SeekBackwardJob-QPGETX/main/corerun1024?Asynchronous451.809 us5.1902 us4.8550 us450.947 us444.028 us460.332 us1.000.00---385 B
SeekBackwardJob-BAGWTC/pr/corerun1024?Asynchronous492.744 us2.0518 us1.8189 us492.569 us490.446 us496.816 us1.090.01---313 B
ReadByteJob-QPGETX/main/corerun1024?Asynchronous9.553 us0.1292 us0.1208 us9.543 us9.374 us9.745 us1.000.000.71670.3395-4,504 B
ReadByteJob-BAGWTC/pr/corerun1024?Asynchronous8.532 us0.1123 us0.0995 us8.524 us8.402 us8.744 us0.890.020.70380.3351-4,432 B
WriteByteJob-QPGETX/main/corerun1024?Asynchronous146.107 us5.4324 us6.2560 us146.081 us132.700 us155.379 us1.000.000.5580--4,504 B
WriteByteJob-BAGWTC/pr/corerun1024?Asynchronous146.575 us3.9805 us4.4243 us146.108 us141.505 us154.773 us1.000.050.5631--4,432 B
FlushJob-QPGETX/main/corerun1024?Asynchronous1,465.149 us29.0065 us29.7876 us1,473.030 us1,420.535 us1,514.044 us1.000.00---4,507 B
FlushJob-BAGWTC/pr/corerun1024?Asynchronous1,429.309 us17.6175 us16.4794 us1,430.584 us1,404.666 us1,464.736 us0.970.02---4,435 B
FlushAsyncJob-QPGETX/main/corerun1024?Asynchronous1,453.589 us19.9868 us18.6957 us1,456.899 us1,417.828 us1,483.716 us1.000.00---4,507 B
FlushAsyncJob-BAGWTC/pr/corerun1024?Asynchronous3,256.667 us161.5740 us179.5891 us3,242.541 us3,004.659 us3,562.605 us2.240.1415.6250--160,507 B
CopyToFileAsyncJob-QPGETX/main/corerun1024?Asynchronous233.585 us10.7639 us11.9640 us229.083 us218.522 us262.575 us1.000.001.81160.9058-9,625 B
CopyToFileAsyncJob-BAGWTC/pr/corerun1024?Asynchronous228.227 us1.8647 us1.6530 us228.272 us225.020 us231.415 us0.970.050.9058--5,561 B
ReadJob-QPGETX/main/corerun1048576512None212.888 us0.8929 us0.8352 us212.995 us210.851 us213.733 us1.000.00---4,384 B
ReadJob-BAGWTC/pr/corerun1048576512None243.563 us29.2624 us33.6986 us229.588 us213.017 us325.227 us1.140.16---4,432 B
WriteJob-QPGETX/main/corerun1048576512None2,093.811 us60.8082 us65.0641 us2,103.629 us1,911.552 us2,179.008 us1.000.00---4,387 B
WriteJob-BAGWTC/pr/corerun1048576512None2,869.496 us332.1857 us326.2508 us2,788.768 us2,507.765 us3,661.121 us1.370.15---4,436 B
ReadAsyncJob-QPGETX/main/corerun1048576512None2,673.695 us40.2207 us33.5861 us2,682.967 us2,629.444 us2,719.044 us1.000.0031.2500--234,111 B
ReadAsyncJob-BAGWTC/pr/corerun1048576512None890.693 us81.8059 us94.2078 us859.895 us764.471 us1,086.032 us0.350.036.2500--56,048 B
WriteAsyncJob-QPGETX/main/corerun1048576512None7,395.528 us1,190.6268 us1,323.3785 us7,055.125 us5,742.475 us10,715.698 us1.000.0020.8333--234,112 B
WriteAsyncJob-BAGWTC/pr/corerun1048576512None4,229.759 us493.7940 us568.6539 us4,285.571 us3,174.620 us5,226.970 us0.590.12---49,774 B
ReadJob-QPGETX/main/corerun1048576512Asynchronous874.329 us43.4114 us48.2516 us878.890 us755.174 us957.562 us1.000.003.6765--35,320 B
ReadJob-BAGWTC/pr/corerun1048576512Asynchronous284.112 us13.3124 us15.3305 us281.115 us264.809 us304.946 us0.330.03---4,432 B
WriteJob-QPGETX/main/corerun1048576512Asynchronous4,143.986 us334.6667 us371.9811 us4,115.753 us3,519.794 us4,993.936 us1.000.00---33,264 B
WriteJob-BAGWTC/pr/corerun1048576512Asynchronous3,011.702 us167.4032 us179.1196 us2,984.304 us2,680.668 us3,364.220 us0.730.08---4,437 B
ReadAsyncJob-QPGETX/main/corerun1048576512Asynchronous721.451 us40.7112 us45.2504 us730.462 us632.137 us818.367 us1.000.004.4643--35,479 B
ReadAsyncJob-BAGWTC/pr/corerun1048576512Asynchronous1,091.716 us70.6851 us81.4010 us1,112.973 us917.899 us1,205.433 us1.530.144.8077--56,053 B
WriteAsyncJob-QPGETX/main/corerun1048576512Asynchronous4,796.827 us436.7428 us485.4384 us4,771.958 us4,106.877 us5,630.695 us1.000.00---33,331 B
WriteAsyncJob-BAGWTC/pr/corerun1048576512Asynchronous5,470.590 us327.2312 us363.7166 us5,408.549 us4,782.366 us6,275.705 us1.150.14---49,775 B
ReadJob-QPGETX/main/corerun10485764096None291.232 us80.9086 us93.1745 us275.141 us187.374 us503.463 us1.000.00---264 B
ReadJob-BAGWTC/pr/corerun10485764096None334.109 us68.0650 us78.3837 us337.590 us215.847 us446.806 us1.200.26---312 B
WriteJob-QPGETX/main/corerun10485764096None4,607.837 us746.3315 us829.5455 us4,341.023 us3,525.470 us6,231.949 us1.000.00---271 B
WriteJob-BAGWTC/pr/corerun10485764096None24,002.911 us6,093.4927 us7,017.2753 us25,402.684 us5,415.475 us33,483.806 us5.482.15---339 B
ReadAsyncJob-QPGETX/main/corerun10485764096None713.696 us63.2913 us72.8863 us717.152 us607.976 us853.725 us1.000.002.9762--29,276 B
ReadAsyncJob-BAGWTC/pr/corerun10485764096None605.516 us47.2774 us54.4448 us609.381 us538.396 us744.988 us0.860.11---756 B
WriteAsyncJob-QPGETX/main/corerun10485764096None6,578.191 us1,095.7718 us1,261.8925 us6,220.224 us4,957.093 us9,751.148 us1.000.00---29,288 B
WriteAsyncJob-BAGWTC/pr/corerun10485764096None4,791.675 us369.3669 us410.5503 us4,700.800 us4,099.328 us5,881.630 us0.740.16---813 B
ReadJob-QPGETX/main/corerun10485764096Asynchronous667.152 us47.6134 us54.8316 us664.576 us591.384 us771.715 us1.000.002.9762--31,153 B
ReadJob-BAGWTC/pr/corerun10485764096Asynchronous221.857 us19.0853 us21.9786 us213.092 us193.838 us266.605 us0.330.04---312 B
WriteJob-QPGETX/main/corerun10485764096Asynchronous3,980.727 us370.4189 us396.3441 us3,957.809 us3,349.570 us4,730.507 us1.000.00---19,288 B
WriteJob-BAGWTC/pr/corerun10485764096Asynchronous6,262.792 us6,252.7235 us6,690.3441 us2,651.381 us2,079.099 us21,867.644 us1.611.78---317 B
ReadAsyncJob-QPGETX/main/corerun10485764096Asynchronous574.786 us42.1783 us48.5726 us569.356 us478.921 us646.506 us1.000.004.0323--31,354 B
ReadAsyncJob-BAGWTC/pr/corerun10485764096Asynchronous599.043 us61.3204 us70.6167 us580.360 us513.933 us751.406 us1.050.17---754 B
WriteAsyncJob-QPGETX/main/corerun10485764096Asynchronous4,846.933 us458.6288 us470.9780 us4,990.255 us3,684.055 us5,555.314 us1.000.00---19,103 B
WriteAsyncJob-BAGWTC/pr/corerun10485764096Asynchronous4,444.319 us436.1178 us484.7438 us4,336.010 us3,632.459 us5,540.288 us0.920.13---804 B
Read_NoBufferingJob-QPGETX/main/corerun104857616384None91.605 us3.8155 us4.2409 us91.474 us85.531 us100.839 us1.000.00---264 B
Read_NoBufferingJob-BAGWTC/pr/corerun104857616384None89.649 us4.0027 us4.4490 us88.851 us83.412 us98.799 us0.980.06---248 B
Write_NoBufferingJob-QPGETX/main/corerun104857616384None3,030.421 us411.9500 us457.8813 us2,890.191 us2,457.090 us3,926.457 us1.000.00---268 B
Write_NoBufferingJob-BAGWTC/pr/corerun104857616384None3,190.733 us476.3798 us529.4949 us3,125.416 us2,519.836 us4,427.951 us1.080.26---253 B
ReadAsync_NoBufferingJob-QPGETX/main/corerun104857616384None216.910 us10.3131 us10.5908 us216.302 us194.176 us230.152 us1.000.00---7,769 B
ReadAsync_NoBufferingJob-BAGWTC/pr/corerun104857616384None194.662 us4.7074 us4.8342 us195.164 us187.065 us204.551 us0.900.06---601 B
WriteAsync_NoBufferingJob-QPGETX/main/corerun104857616384None3,825.778 us451.5085 us519.9578 us3,924.552 us2,846.575 us4,697.095 us1.000.00---7,778 B
WriteAsync_NoBufferingJob-BAGWTC/pr/corerun104857616384None3,784.943 us269.1751 us309.9824 us3,754.963 us3,212.023 us4,566.550 us1.010.17---651 B
Read_NoBufferingJob-QPGETX/main/corerun104857616384Asynchronous237.765 us15.7084 us16.8078 us235.056 us215.272 us273.018 us1.000.001.0081--8,082 B
Read_NoBufferingJob-BAGWTC/pr/corerun104857616384Asynchronous94.289 us3.6132 us4.1610 us94.142 us84.586 us101.156 us0.400.03---248 B
Write_NoBufferingJob-QPGETX/main/corerun104857616384Asynchronous4,665.512 us342.8943 us394.8775 us4,654.113 us4,137.129 us5,534.271 us1.000.00---8,341 B
Write_NoBufferingJob-BAGWTC/pr/corerun104857616384Asynchronous3,010.067 us291.1990 us335.3452 us3,106.774 us2,197.075 us3,431.360 us0.650.10---252 B
ReadAsync_NoBufferingJob-QPGETX/main/corerun104857616384Asynchronous210.353 us13.6612 us15.7323 us209.226 us187.863 us238.718 us1.000.000.7530--8,313 B
ReadAsync_NoBufferingJob-BAGWTC/pr/corerun104857616384Asynchronous194.484 us8.0280 us9.2451 us194.840 us172.108 us211.183 us0.930.07---601 B
WriteAsync_NoBufferingJob-QPGETX/main/corerun104857616384Asynchronous3,714.112 us360.9967 us401.2468 us3,628.559 us3,082.772 us4,383.092 us1.000.00---7,811 B
WriteAsync_NoBufferingJob-BAGWTC/pr/corerun104857616384Asynchronous3,916.907 us421.5212 us468.5197 us4,013.152 us3,095.734 us4,838.514 us1.060.13---651 B
CopyToFileJob-QPGETX/main/corerun1048576?None2,306.942 us359.6185 us399.7150 us2,300.537 us1,761.403 us3,216.894 us1.000.00---531 B
CopyToFileJob-BAGWTC/pr/corerun1048576?None2,957.474 us230.7856 us265.7731 us2,982.680 us2,324.295 us3,396.686 us1.330.20---628 B
CopyToFileAsyncJob-QPGETX/main/corerun1048576?None3,326.559 us238.3014 us274.4283 us3,334.431 us2,831.326 us3,915.690 us1.000.00---2,993 B
CopyToFileAsyncJob-BAGWTC/pr/corerun1048576?None3,770.375 us394.1241 us453.8739 us3,877.305 us2,999.828 us4,642.659 us1.140.17---1,595 B
CopyToFileAsyncJob-QPGETX/main/corerun1048576?Asynchronous3,598.849 us309.0315 us355.8811 us3,613.892 us2,984.037 us4,393.462 us1.000.00---3,129 B
CopyToFileAsyncJob-BAGWTC/pr/corerun1048576?Asynchronous3,393.550 us391.0080 us450.2853 us3,275.451 us2,751.701 us4,354.110 us0.950.17---1,593 B
ReadJob-QPGETX/main/corerun1048576004096None23,399.903 us834.0666 us856.5250 us23,489.900 us22,096.018 us25,471.955 us1.000.00---405 B
ReadJob-BAGWTC/pr/corerun1048576004096None25,942.834 us1,061.8781 us1,222.8605 us26,042.000 us23,802.590 us28,164.680 us1.120.07---458 B
WriteJob-QPGETX/main/corerun1048576004096None144,779.567 us4,175.8159 us4,468.0763 us144,988.600 us138,288.200 us153,266.100 us1.000.00---696 B
WriteJob-BAGWTC/pr/corerun1048576004096None217,093.263 us44,556.4565 us51,311.2816 us228,892.650 us140,116.700 us281,122.450 us1.460.36---1,592 B
ReadAsyncJob-QPGETX/main/corerun1048576004096None42,119.799 us1,720.7047 us1,981.5661 us42,579.688 us39,058.550 us45,355.750 us1.000.00250.0000--2,867,980 B
ReadAsyncJob-BAGWTC/pr/corerun1048576004096None42,079.027 us2,144.9324 us2,470.1073 us41,417.613 us38,495.975 us48,569.850 us1.000.06---1,076 B
WriteAsyncJob-QPGETX/main/corerun1048576004096None179,400.611 us14,377.4046 us15,383.6619 us181,689.300 us134,568.500 us203,965.200 us1.000.00---2,868,856 B
WriteAsyncJob-BAGWTC/pr/corerun1048576004096None170,888.637 us8,382.4656 us9,317.0883 us168,337.300 us158,813.900 us191,886.800 us0.960.12---1,880 B
ReadJob-QPGETX/main/corerun1048576004096Asynchronous63,218.862 us2,640.5985 us2,935.0182 us62,718.000 us58,924.900 us70,179.100 us1.000.00250.0000--3,075,958 B
ReadJob-BAGWTC/pr/corerun1048576004096Asynchronous23,423.308 us948.4075 us1,092.1875 us23,362.044 us21,885.400 us25,699.633 us0.370.03---595 B
WriteJob-QPGETX/main/corerun1048576004096Asynchronous199,284.595 us8,736.9244 us9,711.0684 us199,444.500 us180,959.900 us215,530.000 us1.000.00---1,461,960 B
WriteJob-BAGWTC/pr/corerun1048576004096Asynchronous213,061.720 us46,212.1040 us53,217.9277 us234,001.475 us137,021.750 us296,714.900 us1.070.29---1,592 B
ReadAsyncJob-QPGETX/main/corerun1048576004096Asynchronous43,653.359 us2,655.4463 us3,058.0160 us44,046.575 us39,986.850 us50,211.725 us1.000.00250.0000--3,072,812 B
ReadAsyncJob-BAGWTC/pr/corerun1048576004096Asynchronous41,947.446 us1,406.6135 us1,619.8582 us42,051.088 us39,788.050 us45,277.500 us0.960.07---1,076 B
WriteAsyncJob-QPGETX/main/corerun1048576004096Asynchronous166,271.189 us12,416.3049 us13,800.6900 us167,172.100 us123,793.900 us189,544.200 us1.000.00---1,441,264 B
WriteAsyncJob-BAGWTC/pr/corerun1048576004096Asynchronous171,520.650 us6,832.9447 us7,311.1743 us171,350.450 us153,063.900 us184,628.900 us1.040.11---1,880 B
Read_NoBufferingJob-QPGETX/main/corerun10485760016384None13,984.887 us391.3896 us450.7248 us13,923.414 us13,196.639 us15,009.794 us1.000.00---350 B
Read_NoBufferingJob-BAGWTC/pr/corerun10485760016384None13,053.314 us425.6564 us490.1865 us12,912.739 us12,368.439 us14,252.900 us0.930.05---334 B
Write_NoBufferingJob-QPGETX/main/corerun10485760016384None196,158.325 us56,483.1831 us65,046.1177 us165,497.125 us125,623.650 us303,497.550 us1.000.00---1,540 B
Write_NoBufferingJob-BAGWTC/pr/corerun10485760016384None182,091.735 us46,916.3716 us54,028.9633 us171,445.350 us125,516.500 us265,289.950 us1.030.42---1,548 B
ReadAsync_NoBufferingJob-QPGETX/main/corerun10485760016384None19,629.685 us906.3963 us1,007.4571 us19,855.200 us18,411.733 us21,551.067 us1.000.00111.1111--717,480 B
ReadAsync_NoBufferingJob-BAGWTC/pr/corerun10485760016384None17,475.076 us467.3154 us519.4198 us17,475.429 us16,593.207 us18,284.829 us0.890.05---741 B
WriteAsync_NoBufferingJob-QPGETX/main/corerun10485760016384None149,897.218 us5,214.1471 us5,354.5452 us149,634.000 us143,423.600 us163,409.000 us1.000.00---718,456 B
WriteAsync_NoBufferingJob-BAGWTC/pr/corerun10485760016384None188,994.622 us40,928.8802 us47,133.7593 us184,113.150 us135,145.100 us259,066.100 us1.240.34---2,120 B
Read_NoBufferingJob-QPGETX/main/corerun10485760016384Asynchronous25,433.846 us2,726.2854 us2,917.0948 us25,054.110 us21,834.970 us32,484.470 us1.000.00100.0000--770,022 B
Read_NoBufferingJob-BAGWTC/pr/corerun10485760016384Asynchronous13,445.746 us1,009.9237 us1,122.5275 us13,422.230 us11,888.660 us15,950.975 us0.540.07---326 B
Write_NoBufferingJob-QPGETX/main/corerun10485760016384Asynchronous158,956.821 us11,724.0564 us13,031.2577 us158,849.100 us140,548.000 us189,603.300 us1.000.00---741,152 B
Write_NoBufferingJob-BAGWTC/pr/corerun10485760016384Asynchronous206,453.075 us44,082.4809 us50,765.4506 us219,365.775 us128,252.800 us272,652.350 us1.300.38---1,548 B
ReadAsync_NoBufferingJob-QPGETX/main/corerun10485760016384Asynchronous17,817.295 us335.2129 us344.2389 us17,894.800 us17,063.333 us18,338.617 us1.000.0083.3333--769,128 B
ReadAsync_NoBufferingJob-BAGWTC/pr/corerun10485760016384Asynchronous16,499.864 us456.8564 us507.7947 us16,492.793 us15,673.807 us17,467.100 us0.920.03---782 B
WriteAsync_NoBufferingJob-QPGETX/main/corerun10485760016384Asynchronous197,024.280 us47,985.4471 us55,260.1122 us193,331.200 us120,682.150 us278,943.150 us1.000.00---718,748 B
WriteAsync_NoBufferingJob-BAGWTC/pr/corerun10485760016384Asynchronous196,696.003 us42,409.1720 us48,838.4656 us193,615.500 us136,827.100 us279,858.950 us1.020.17---2,120 B
CopyToFileJob-QPGETX/main/corerun104857600?None220,226.888 us33,018.6894 us38,024.3718 us223,760.800 us158,415.200 us280,972.300 us1.000.00---1,692 B
CopyToFileJob-BAGWTC/pr/corerun104857600?None238,110.705 us43,490.6919 us50,083.9455 us254,081.950 us139,455.100 us291,811.300 us1.110.30---1,812 B
CopyToFileAsyncJob-QPGETX/main/corerun104857600?None226,310.170 us41,002.0146 us47,217.9810 us197,836.600 us179,116.900 us297,272.000 us1.000.00---181,288 B
CopyToFileAsyncJob-BAGWTC/pr/corerun104857600?None334,515.905 us18,842.5946 us21,699.1600 us331,268.850 us302,936.800 us376,991.500 us1.520.24---4,520 B
CopyToFileAsyncJob-QPGETX/main/corerun104857600?Asynchronous203,847.025 us33,754.7055 us38,871.9690 us182,818.100 us159,513.900 us265,586.400 us1.000.00---187,760 B
CopyToFileAsyncJob-BAGWTC/pr/corerun104857600?Asynchronous254,340.800 us36,762.8850 us42,336.1930 us260,538.000 us169,910.200 us319,177.900 us1.270.24---2,480 B

@stephentoub
stephentoubforce-pushed the unixfilestreamstrategy branch 2 times, most recently from 9980217 to 1543ec2CompareJuly 7, 2021 02:46
@adamsitnik

Copy link
Copy Markdown
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!

Details
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
MethodToolchainfileSizeuserBufferSizeoptionsMeanRatioAllocated
Read/pr/corerun10241024None6.416 us1.074,432 B
Read/main/corerun10241024None6.025 us1.004,392 B
Write/pr/corerun10241024None33.733 us1.004,432 B
Write/main/corerun10241024None33.764 us1.004,392 B
ReadAsync/pr/corerun10241024None9.636 us0.985,008 B
ReadAsync/main/corerun10241024None9.821 us1.004,776 B
WriteAsync/pr/corerun10241024None34.357 us0.914,520 B
WriteAsync/main/corerun10241024None38.010 us1.004,839 B
Read/pr/corerun10241024Asynchronous6.387 us0.744,432 B
Read/main/corerun10241024Asynchronous8.643 us1.004,632 B
Write/pr/corerun10241024Asynchronous33.341 us0.964,432 B
Write/main/corerun10241024Asynchronous34.911 us1.004,512 B
ReadAsync/pr/corerun10241024Asynchronous9.514 us0.995,008 B
ReadAsync/main/corerun10241024Asynchronous9.635 us1.004,818 B
WriteAsync/pr/corerun10241024Asynchronous33.711 us0.984,520 B
WriteAsync/main/corerun10241024Asynchronous34.237 us1.004,512 B
OpenClose/pr/corerun1024?None3.824 us0.98312 B
OpenClose/main/corerun1024?None3.901 us1.00272 B
LockUnlock/pr/corerun1024?None6.318 us0.99312 B
LockUnlock/main/corerun1024?None6.396 us1.00272 B
SeekForward/pr/corerun1024?None19.521 us0.04312 B
SeekForward/main/corerun1024?None443.746 us1.00273 B
SeekBackward/pr/corerun1024?None517.294 us1.15313 B
SeekBackward/main/corerun1024?None450.790 us1.00273 B
ReadByte/pr/corerun1024?None9.640 us0.934,432 B
ReadByte/main/corerun1024?None10.329 us1.004,392 B
WriteByte/pr/corerun1024?None35.861 us0.964,432 B
WriteByte/main/corerun1024?None37.339 us1.004,392 B
Flush/pr/corerun1024?None1,529.077 us1.024,434 B
Flush/main/corerun1024?None1,493.796 us1.004,395 B
FlushAsync/pr/corerun1024?None3,189.850 us2.13160,527 B
FlushAsync/main/corerun1024?None1,495.268 us1.004,394 B
CopyToFile/pr/corerun1024?None39.144 us1.014,744 B
CopyToFile/main/corerun1024?None38.930 us1.008,784 B
CopyToFileAsync/pr/corerun1024?None84.709 us0.845,560 B
CopyToFileAsync/main/corerun1024?None100.404 us1.009,672 B
OpenClose/pr/corerun1024?Asynchronous3.705 us0.92312 B
OpenClose/main/corerun1024?Asynchronous4.033 us1.00392 B
LockUnlock/pr/corerun1024?Asynchronous6.388 us0.99312 B
LockUnlock/main/corerun1024?Asynchronous6.447 us1.00392 B
SeekForward/pr/corerun1024?Asynchronous19.844 us0.04312 B
SeekForward/main/corerun1024?Asynchronous444.649 us1.00393 B
SeekBackward/pr/corerun1024?Asynchronous519.951 us1.18313 B
SeekBackward/main/corerun1024?Asynchronous441.413 us1.00393 B
ReadByte/pr/corerun1024?Asynchronous9.730 us0.924,432 B
ReadByte/main/corerun1024?Asynchronous10.631 us1.004,512 B
WriteByte/pr/corerun1024?Asynchronous35.854 us0.944,432 B
WriteByte/main/corerun1024?Asynchronous38.265 us1.004,512 B
Flush/pr/corerun1024?Asynchronous1,485.757 us1.004,434 B
Flush/main/corerun1024?Asynchronous1,486.036 us1.004,514 B
FlushAsync/pr/corerun1024?Asynchronous3,239.967 us2.16160,526 B
FlushAsync/main/corerun1024?Asynchronous1,501.255 us1.004,514 B
CopyToFileAsync/pr/corerun1024?Asynchronous86.263 us0.955,560 B
CopyToFileAsync/main/corerun1024?Asynchronous90.828 us1.009,640 B
Read/pr/corerun1048576512None247.189 us1.044,432 B
Read/main/corerun1048576512None237.486 us1.004,392 B
Write/pr/corerun1048576512None1,207.718 us1.004,434 B
Write/main/corerun1048576512None1,206.753 us1.004,394 B
ReadAsync/pr/corerun1048576512None721.925 us0.2556,073 B
ReadAsync/main/corerun1048576512None2,940.302 us1.00234,114 B
WriteAsync/pr/corerun1048576512None2,348.989 us0.4649,800 B
WriteAsync/main/corerun1048576512None5,066.171 us1.00234,117 B
Read/pr/corerun1048576512Asynchronous246.466 us0.304,432 B
Read/main/corerun1048576512Asynchronous808.704 us1.0035,307 B
Write/pr/corerun1048576512Asynchronous1,214.645 us0.594,434 B
Write/main/corerun1048576512Asynchronous2,049.666 us1.0033,221 B
ReadAsync/pr/corerun1048576512Asynchronous749.090 us1.2156,073 B
ReadAsync/main/corerun1048576512Asynchronous622.242 us1.0035,482 B
WriteAsync/pr/corerun1048576512Asynchronous2,438.205 us1.1449,799 B
WriteAsync/main/corerun1048576512Asynchronous2,135.728 us1.0033,326 B
Read/pr/corerun10485764096None196.300 us1.00312 B
Read/main/corerun10485764096None196.261 us1.00272 B
Write/pr/corerun10485764096None1,146.589 us0.99314 B
Write/main/corerun10485764096None1,155.701 us1.00274 B
ReadAsync/pr/corerun10485764096None395.510 us0.93753 B
ReadAsync/main/corerun10485764096None426.427 us1.0029,281 B
WriteAsync/pr/corerun10485764096None1,887.500 us0.97797 B
WriteAsync/main/corerun10485764096None1,954.203 us1.0029,285 B
Read/pr/corerun10485764096Asynchronous193.996 us0.35312 B
Read/main/corerun10485764096Asynchronous551.382 us1.0031,114 B
Write/pr/corerun10485764096Asynchronous1,143.294 us0.65314 B
Write/main/corerun10485764096Asynchronous1,769.554 us1.0019,724 B
ReadAsync/pr/corerun10485764096Asynchronous392.859 us0.91753 B
ReadAsync/main/corerun10485764096Asynchronous431.722 us1.0031,361 B
WriteAsync/pr/corerun10485764096Asynchronous1,916.619 us1.05797 B
WriteAsync/main/corerun10485764096Asynchronous1,827.265 us1.0019,101 B
Read_NoBuffering/pr/corerun104857616384None97.851 us1.00248 B
Read_NoBuffering/main/corerun104857616384None98.107 us1.00272 B
Write_NoBuffering/pr/corerun104857616384None1,083.664 us1.01250 B
Write_NoBuffering/main/corerun104857616384None1,078.379 us1.00274 B
ReadAsync_NoBuffering/pr/corerun104857616384None156.729 us0.90600 B
ReadAsync_NoBuffering/main/corerun104857616384None174.278 us1.007,777 B
WriteAsync_NoBuffering/pr/corerun104857616384None1,504.483 us1.00644 B
WriteAsync_NoBuffering/main/corerun104857616384None1,506.338 us1.007,780 B
Read_NoBuffering/pr/corerun104857616384Asynchronous96.303 us0.47248 B
Read_NoBuffering/main/corerun104857616384Asynchronous204.124 us1.008,073 B
Write_NoBuffering/pr/corerun104857616384Asynchronous1,071.900 us0.74250 B
Write_NoBuffering/main/corerun104857616384Asynchronous1,454.374 us1.008,757 B
ReadAsync_NoBuffering/pr/corerun104857616384Asynchronous156.961 us0.89600 B
ReadAsync_NoBuffering/main/corerun104857616384Asynchronous175.874 us1.008,321 B
WriteAsync_NoBuffering/pr/corerun104857616384Asynchronous1,505.395 us0.98644 B
WriteAsync_NoBuffering/main/corerun104857616384Asynchronous1,545.705 us1.007,812 B
CopyToFile/pr/corerun1048576?None1,105.359 us1.00626 B
CopyToFile/main/corerun1048576?None1,107.982 us1.00546 B
CopyToFileAsync/pr/corerun1048576?None1,726.333 us1.051,588 B
CopyToFileAsync/main/corerun1048576?None1,644.275 us1.003,004 B
CopyToFileAsync/pr/corerun1048576?Asynchronous1,739.108 us1.041,588 B
CopyToFileAsync/main/corerun1048576?Asynchronous1,687.384 us1.003,140 B
Read/pr/corerun1048576004096None26,761.720 us0.99360 B
Read/main/corerun1048576004096None27,150.873 us1.00320 B
Write/pr/corerun1048576004096None117,778.592 us1.00528 B
Write/main/corerun1048576004096None118,354.775 us1.00488 B
ReadAsync/pr/corerun1048576004096None45,089.878 us0.951,076 B
ReadAsync/main/corerun1048576004096None47,512.244 us1.002,867,988 B
WriteAsync/pr/corerun1048576004096None149,047.259 us0.951,440 B
WriteAsync/main/corerun1048576004096None156,469.046 us1.002,868,456 B
Read/pr/corerun1048576004096Asynchronous26,635.537 us0.42360 B
Read/main/corerun1048576004096Asynchronous63,528.340 us1.003,072,588 B
Write/pr/corerun1048576004096Asynchronous123,505.133 us0.76528 B
Write/main/corerun1048576004096Asynchronous163,149.767 us1.001,467,944 B
ReadAsync/pr/corerun1048576004096Asynchronous44,981.457 us0.951,076 B
ReadAsync/main/corerun1048576004096Asynchronous47,548.427 us1.003,072,820 B
WriteAsync/pr/corerun1048576004096Asynchronous158,313.373 us0.982,088 B
WriteAsync/main/corerun1048576004096Asynchronous162,548.465 us1.001,438,504 B
Read_NoBuffering/pr/corerun10485760016384None16,903.187 us0.99279 B
Read_NoBuffering/main/corerun10485760016384None17,038.535 us1.00303 B
Write_NoBuffering/pr/corerun10485760016384None109,261.127 us1.03464 B
Write_NoBuffering/main/corerun10485760016384None105,745.229 us1.00380 B
ReadAsync_NoBuffering/pr/corerun10485760016384None21,256.015 us0.95718 B
ReadAsync_NoBuffering/main/corerun10485760016384None22,455.891 us1.00717,488 B
WriteAsync_NoBuffering/pr/corerun10485760016384None122,727.605 us0.981,288 B
WriteAsync_NoBuffering/main/corerun10485760016384None124,919.921 us1.00718,056 B
Read_NoBuffering/pr/corerun10485760016384Asynchronous16,699.216 us0.60279 B
Read_NoBuffering/main/corerun10485760016384Asynchronous27,769.229 us1.00768,536 B
Write_NoBuffering/pr/corerun10485760016384Asynchronous106,675.516 us0.83356 B
Write_NoBuffering/main/corerun10485760016384Asynchronous129,051.569 us1.00829,292 B
ReadAsync_NoBuffering/pr/corerun10485760016384Asynchronous21,172.322 us0.93730 B
ReadAsync_NoBuffering/main/corerun10485760016384Asynchronous22,811.289 us1.00768,784 B
WriteAsync_NoBuffering/pr/corerun10485760016384Asynchronous126,101.103 us1.021,288 B
WriteAsync_NoBuffering/main/corerun10485760016384Asynchronous124,090.440 us1.00718,088 B
CopyToFile/pr/corerun104857600?None116,412.401 us0.99840 B
CopyToFile/main/corerun104857600?None117,249.618 us1.00760 B
CopyToFileAsync/pr/corerun104857600?None140,607.107 us0.982,088 B
CopyToFileAsync/main/corerun104857600?None143,821.861 us1.00180,768 B
CopyToFileAsync/pr/corerun104857600?Asynchronous142,692.801 us1.012,232 B
CopyToFileAsync/main/corerun104857600?Asynchronous141,688.091 us1.00187,528 B

@adamsitnik

Copy link
Copy Markdown
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

@stephentoub
stephentoubforce-pushed the unixfilestreamstrategy branch from 1543ec2 to 513e033CompareJuly 7, 2021 15:43

@adamsitnikadamsitnik left a comment

Copy link
Copy Markdown
Member

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 freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.IOtenet-performancePerformance related issue

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement new FileStreamStrategy for Unix

2 participants

@stephentoub@adamsitnik