-
Notifications
You must be signed in to change notification settings - Fork 4.7k
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
Use FileStream overload that preallocates file on WriteAllBytes #51298
Conversation
Tagging subscribers to this area: @carlossanlop Issue DetailsContributes to #51116 Perf results obtained from the benchmarks on dotnet/performance#1774: BenchmarkDotNet=v0.12.1.1521-nightly, OS=Windows 10.0.19042.868 (20H2/October2020Update)
Intel Core i7-9750H CPU 2.60GHz, 1 CPU, 12 logical and 6 physical cores
.NET SDK=6.0.100-preview.3.21207.34
[Host] : .NET 6.0.0 (6.0.21.20104), X64 RyuJIT
Job-EZBBOL : .NET 6.0.0 (42.42.42.42424), X64 RyuJIT
Job-BXKKVU : .NET 6.0.0 (42.42.42.42424), X64 RyuJIT
PowerPlanMode=00000000-0000-0000-0000-000000000000 Arguments=/p:DebugType=portable IterationTime=250.0000 ms
MaxIterationCount=101 MinIterationCount=100 WarmupCount=1
| Method | Toolchain | userBuffer | Mean | Error | StdDev | Median | Min | Max | Ratio | Allocated |
|------------------- |---------- |----------- |-------------:|-------------:|-------------:|-------------:|-------------:|-------------:|------:|----------:|
| WriteAllBytes |base | 512 | 358.6 μs | 8.24 μs | 24.44 μs | 359.5 μs | 286.6 μs | 416.3 μs | 1.00 | 4,355 B |
| WriteAllBytes |new | 512 | 328.8 μs | 5.02 μs | 14.66 μs | 329.8 μs | 277.6 μs | 354.4 μs | 0.92 | 4,472 B |
| | | | | | | | | | | |
| WriteAllBytesAsync |base | 512 | 424.5 μs | 5.59 μs | 16.21 μs | 423.7 μs | 392.0 μs | 468.1 μs | 1.00 | 5,184 B |
| WriteAllBytesAsync |new | 512 | 404.0 μs | 4.23 μs | 12.41 μs | 404.4 μs | 378.7 μs | 435.9 μs | 0.95 | 5,312 B |
| | | | | | | | | | | |
| WriteAllBytes |base | 4096 | 360.7 μs | 9.54 μs | 27.98 μs | 361.9 μs | 278.2 μs | 435.0 μs | 1.00 | 224 B |
| WriteAllBytes |new | 4096 | 321.6 μs | 7.09 μs | 20.56 μs | 328.2 μs | 267.1 μs | 351.0 μs | 0.90 | 352 B |
| | | | | | | | | | | |
| WriteAllBytesAsync |base | 4096 | 401.0 μs | 5.81 μs | 16.58 μs | 401.3 μs | 368.1 μs | 441.7 μs | 1.00 | 5,184 B |
| WriteAllBytesAsync |new | 4096 | 414.3 μs | 7.14 μs | 19.91 μs | 410.8 μs | 369.5 μs | 473.8 μs | 1.03 | 5,312 B |
| | | | | | | | | | | |
| WriteAllBytes |base | 16384 | 1,634.3 μs | 90.53 μs | 266.94 μs | 1,666.7 μs | 857.9 μs | 2,257.5 μs | 1.00 | 225 B |
| WriteAllBytes |new | 16384 | 1,397.7 μs | 105.00 μs | 311.24 μs | 1,339.7 μs | 824.2 μs | 1,994.4 μs | 0.88 | 353 B |
| | | | | | | | | | | |
| WriteAllBytesAsync |base | 16384 | 1,643.1 μs | 103.07 μs | 305.51 μs | 1,651.1 μs | 1,043.2 μs | 2,249.3 μs | 1.00 | 905 B |
| WriteAllBytesAsync |new | 16384 | 1,732.3 μs | 121.13 μs | 359.06 μs | 1,803.8 μs | 1,077.1 μs | 2,361.7 μs | 1.10 | 1,033 B |
| | | | | | | | | | | |
| WriteAllBytes |base | 1048576 | 1,276.9 μs | 53.03 μs | 156.37 μs | 1,303.9 μs | 832.7 μs | 1,629.7 μs | 1.00 | 225 B |
| WriteAllBytes |new | 1048576 | 1,393.0 μs | 49.60 μs | 147.03 μs | 1,379.7 μs | 1,088.6 μs | 1,666.0 μs | 1.11 | 353 B |
| | | | | | | | | | | |
| WriteAllBytesAsync |base | 1048576 | 2,388.1 μs | 51.55 μs | 152.81 μs | 2,418.3 μs | 1,825.8 μs | 2,670.0 μs | 1.00 | 905 B |
| WriteAllBytesAsync |new | 1048576 | 2,234.9 μs | 71.46 μs | 211.83 μs | 2,284.9 μs | 1,287.2 μs | 2,580.5 μs | 0.94 | 1,033 B |
| | | | | | | | | | | |
| WriteAllBytes |base | 104857600 | 177,801.0 μs | 14,731.29 μs | 43,665.55 μs | 188,410.9 μs | 89,479.8 μs | 264,803.5 μs | 1.00 | 368 B |
| WriteAllBytes |new | 104857600 | 181,757.1 μs | 10,989.27 μs | 32,573.70 μs | 179,412.4 μs | 92,253.6 μs | 243,485.6 μs | 1.11 | 424 B |
| | | | | | | | | | | |
| WriteAllBytesAsync |base | 104857600 | 184,642.8 μs | 15,042.38 μs | 44,587.66 μs | 193,423.9 μs | 108,295.1 μs | 261,851.5 μs | 1.00 | 1,048 B |
| WriteAllBytesAsync |new | 104857600 | 175,904.1 μs | 16,981.90 μs | 50,336.65 μs | 187,221.0 μs | 82,085.9 μs | 259,399.6 μs | 1.03 | 1,176 B |
|
Note regarding the This serves as a reminder for when your PR is modifying a ref *.cs file and adding/modifying public APIs, to please make sure the API implementation in the src *.cs file is documented with triple slash comments, so the PR reviewers can sign off that change. |
@jozkee it looks like we are not going to get any speedup in this case. Could find a scenario that uses a different pattern: multiple calls to |
Closing this since it proves that is not beneficial to preallocate a file if we only perform one single Write.
@adamsitnik yup, I will measure the benefits of no buffering on |
Contributes to #51116
Simple change on WriteAllBytes[Async] in order to verify if there is a perf benefit on using the new FileStream ctor. This builds on top of #51111.
Perf results obtained from the benchmarks on dotnet/performance#1774:
Note: allocations increased by 128 B and appears that large writes (>=16Kb) show a perf regression of 10%. Also note that min/maxIterationCount is 100 - 101 in order to neglect the abnormal results.