From 36bc90b474969707a30a6bbdcf38b4d5a2271a72 Mon Sep 17 00:00:00 2001 From: David Cantu Date: Wed, 14 Apr 2021 23:30:20 -0700 Subject: [PATCH 1/2] Add WriteAllBytes benchamarks --- .../System.IO.FileSystem/Perf.File.cs | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/benchmarks/micro/libraries/System.IO.FileSystem/Perf.File.cs b/src/benchmarks/micro/libraries/System.IO.FileSystem/Perf.File.cs index f1430ee8535..41ce13a102a 100644 --- a/src/benchmarks/micro/libraries/System.IO.FileSystem/Perf.File.cs +++ b/src/benchmarks/micro/libraries/System.IO.FileSystem/Perf.File.cs @@ -2,8 +2,11 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Extensions; using MicroBenchmarks; namespace System.IO.Tests @@ -11,10 +14,18 @@ namespace System.IO.Tests [BenchmarkCategory(Categories.Libraries)] public class Perf_File { + private const int OneKibibyte = 1 << 10; // 1024 + private const int HalfKibibyte = OneKibibyte >> 1; + private const int FourKibibytes = OneKibibyte << 2; // default Stream buffer size + private const int SixteenKibibytes = FourKibibytes << 2; // default Stream buffer size * 4 + private const int OneMibibyte = OneKibibyte << 10; + private const int HundredMibibytes = OneMibibyte * 100; + private const int DeleteteInnerIterations = 10; private string _testFilePath; private string[] _filesToRemove; + private Dictionary _userBuffers; [GlobalSetup(Target = nameof(Exists))] public void SetupExists() @@ -46,5 +57,40 @@ public void Delete() foreach (var file in filesToRemove) File.Delete(file); } + + [GlobalSetup(Targets = new[] { nameof(WriteAllBytes), "WriteAllBytesAsync" })] + public void SetupWriteAllBytes() + { + _testFilePath = FileUtils.GetTestFilePath(); + _userBuffers = new Dictionary() + { + { HalfKibibyte, ValuesGenerator.Array(HalfKibibyte) }, + { FourKibibytes, ValuesGenerator.Array(FourKibibytes) }, + { SixteenKibibytes, ValuesGenerator.Array(SixteenKibibytes) }, + { OneMibibyte, ValuesGenerator.Array(OneMibibyte) }, + { HundredMibibytes, ValuesGenerator.Array(HundredMibibytes) }, + }; + } + + [Benchmark] + [Arguments(HalfKibibyte)] + [Arguments(FourKibibytes)] + [Arguments(SixteenKibibytes)] + [Arguments(OneMibibyte)] + [Arguments(HundredMibibytes)] + public void WriteAllBytes(int userBuffer) => File.WriteAllBytes(_testFilePath, _userBuffers[userBuffer]); + +#if !NETFRAMEWORK + [Benchmark] + [Arguments(HalfKibibyte)] + [Arguments(FourKibibytes)] + [Arguments(SixteenKibibytes)] + [Arguments(OneMibibyte)] + [Arguments(HundredMibibytes)] + public Task WriteAllBytesAsync(int userBuffer) => File.WriteAllBytesAsync(_testFilePath, _userBuffers[userBuffer]); +#endif + + [GlobalCleanup(Targets = new[] { nameof(WriteAllBytes), "WriteAllBytesAsync" })] + public void CleanupWriteAllBytes() => File.Delete(_testFilePath); } } From f842a8506464750c7c3fea3263e9681f53e00bc5 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Thu, 15 Apr 2021 14:39:22 +0200 Subject: [PATCH 2/2] Apply suggestions from code review --- .../micro/libraries/System.IO.FileSystem/Perf.File.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/benchmarks/micro/libraries/System.IO.FileSystem/Perf.File.cs b/src/benchmarks/micro/libraries/System.IO.FileSystem/Perf.File.cs index 41ce13a102a..631903b8f2f 100644 --- a/src/benchmarks/micro/libraries/System.IO.FileSystem/Perf.File.cs +++ b/src/benchmarks/micro/libraries/System.IO.FileSystem/Perf.File.cs @@ -78,7 +78,7 @@ public void SetupWriteAllBytes() [Arguments(SixteenKibibytes)] [Arguments(OneMibibyte)] [Arguments(HundredMibibytes)] - public void WriteAllBytes(int userBuffer) => File.WriteAllBytes(_testFilePath, _userBuffers[userBuffer]); + public void WriteAllBytes(int size) => File.WriteAllBytes(_testFilePath, _userBuffers[size]); #if !NETFRAMEWORK [Benchmark] @@ -87,7 +87,7 @@ public void SetupWriteAllBytes() [Arguments(SixteenKibibytes)] [Arguments(OneMibibyte)] [Arguments(HundredMibibytes)] - public Task WriteAllBytesAsync(int userBuffer) => File.WriteAllBytesAsync(_testFilePath, _userBuffers[userBuffer]); + public Task WriteAllBytesAsync(int size) => File.WriteAllBytesAsync(_testFilePath, _userBuffers[size]); #endif [GlobalCleanup(Targets = new[] { nameof(WriteAllBytes), "WriteAllBytesAsync" })]