From 46820e6c82cf54f11d83f247486ea58d2e46a6f7 Mon Sep 17 00:00:00 2001 From: djfoxer Date: Sun, 11 Jul 2021 12:13:16 +0200 Subject: [PATCH] Feature/dotnet6 p5 bigint (#2) net6 - bigint parser benchmark --- README.md | 11 +++++-- doc/Benchmark_DotNet6.md | 28 +++++++++++++++++- img/cmp_3_2.png | Bin 0 -> 58985 bytes scripts/publish.bat | 2 +- .../djfoxer.PerformanceDotNet.App.csproj | 2 +- .../FileStreamBenchmark.cs | 6 ++-- .../MainBenchmark.cs | 19 ++++++------ .../ParseBenchmark.cs | 21 +++++++++++++ .../djfoxer.PerformanceDotNet.Common.csproj | 2 +- 9 files changed, 73 insertions(+), 18 deletions(-) create mode 100644 img/cmp_3_2.png create mode 100644 src/djfoxer.PerformanceDotNet/djfoxer.PerformanceDotNet.Common/ParseBenchmark.cs diff --git a/README.md b/README.md index 30bb91d..ba26dc1 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,13 @@ public bool StringStartsWith() } ``` +### BigInt: +```csharp +// _bingIntToParse = string.Concat(Enumerable.Repeat("654719003", 50)); + +public BigInteger ParseBigInt() => BigInteger.Parse(_bingIntToParse); +``` + ### Deserialize: ```csharp @@ -126,9 +133,9 @@ using (var fileStream = new FileStream(_fileName, FileMode.Create, FileAccess.Wr } } ``` -# Benchmark experiment #3 [07.06.2021]: +# Benchmark experiment #3 [11.07.2021]: -.NET 6 Preview 4 is now available. New SDK brings huge FileStream performance boost (up to 4x faster ), check it out: **[.NET 6 FileStream Boost Details](doc/Benchmark_DotNet6.md)**. +.NET 6 Preview 4 is now available. New SDK brings huge performance boost in FileStream (up to 4x faster) and BigInteger parser (up to 16x faster), check it out: **[.NET 6 Boost Details](doc/Benchmark_DotNet6.md)**. ![logo](img/ben3.png) diff --git a/doc/Benchmark_DotNet6.md b/doc/Benchmark_DotNet6.md index d2c675d..516b403 100644 --- a/doc/Benchmark_DotNet6.md +++ b/doc/Benchmark_DotNet6.md @@ -1,4 +1,6 @@ -# .NET 6 FileStream Performance Boost +# .NET 6 Performance Boost + +## FileStream results ``` ini @@ -26,3 +28,27 @@ Intel Core i7-4702MQ CPU 2.20GHz (Haswell), 1 CPU, 8 logical and 4 physical core | WriteAsync | .NET Framework 4.8 | .NET Framework 4.8 | 17.969 ms | 0.4371 ms | 1.2541 ms | 17.220 ms | 1.00 | 0.00 | ![Chart](../img/cmp_3_1.png) + +## BigInteger parser results + +``` ini + +BenchmarkDotNet=v0.13.0, OS=Windows 10.0.19043.1083 (21H1/May2021Update) +Intel Core i7-4702MQ CPU 2.20GHz (Haswell), 1 CPU, 8 logical and 4 physical cores +.NET SDK=6.0.100-preview.5.21302.13 + [Host] : .NET 5.0.5 (5.0.521.16609), X64 RyuJIT + .NET 5.0 : .NET 5.0.7 (5.0.721.25508), X64 RyuJIT + .NET 6.0 : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT + .NET Core 3.1 : .NET Core 3.1.16 (CoreCLR 4.700.21.26205, CoreFX 4.700.21.26205), X64 RyuJIT + .NET Framework 4.8 : .NET Framework 4.8 (4.8.4390.0), X64 RyuJIT + + +``` +| Method | Job | Runtime | Mean | Error | StdDev | Ratio | +|------------ |------------------- |------------------- |----------:|----------:|----------:|------:| +| ParseBigInt | .NET 5.0 | .NET 5.0 | 71.578 μs | 0.7426 μs | 0.6947 μs | 0.76 | +| ParseBigInt | .NET 6.0 | .NET 6.0 | 5.538 μs | 0.0555 μs | 0.0520 μs | 0.06 | +| ParseBigInt | .NET Core 3.1 | .NET Core 3.1 | 90.957 μs | 0.4245 μs | 0.3970 μs | 0.97 | +| ParseBigInt | .NET Framework 4.8 | .NET Framework 4.8 | 93.959 μs | 0.8641 μs | 0.8082 μs | 1.00 | + +![Chart](../img/cmp_3_2.png) \ No newline at end of file diff --git a/img/cmp_3_2.png b/img/cmp_3_2.png new file mode 100644 index 0000000000000000000000000000000000000000..28f1432a8b768e5385ea56a9ad6b424631e3f169 GIT binary patch literal 58985 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 literal 0 HcmV?d00001 diff --git a/scripts/publish.bat b/scripts/publish.bat index ce4bf1a..201c7bf 100644 --- a/scripts/publish.bat +++ b/scripts/publish.bat @@ -6,7 +6,7 @@ dotnet publish "../src/djfoxer.PerformanceDotNet/djfoxer.PerformanceDotNet.App" REM copy src Xcopy /S /I /E /Q "../src/djfoxer.PerformanceDotNet" "artifact/bin" /exclude:xcopy_exclude.txt REM create run.bat script -echo .\bin\exe\djfoxer.PerformanceDotNet.App.exe > artifact/run.bat +echo .\bin\exe\djfoxer.PerformanceDotNet.App.exe %%^* > artifact/run.bat REM open artifact folder cd artifact REM get exe version diff --git a/src/djfoxer.PerformanceDotNet/djfoxer.PerformanceDotNet.App/djfoxer.PerformanceDotNet.App.csproj b/src/djfoxer.PerformanceDotNet/djfoxer.PerformanceDotNet.App/djfoxer.PerformanceDotNet.App.csproj index 3a2601d..c14b6be 100644 --- a/src/djfoxer.PerformanceDotNet/djfoxer.PerformanceDotNet.App/djfoxer.PerformanceDotNet.App.csproj +++ b/src/djfoxer.PerformanceDotNet/djfoxer.PerformanceDotNet.App/djfoxer.PerformanceDotNet.App.csproj @@ -3,7 +3,7 @@ Exe net6.0;net5.0;netcoreapp3.1;net48 - 1.2.0 + 1.2.2 x64 djfoxer.PerformanceDotNet.App.Program djfoxer diff --git a/src/djfoxer.PerformanceDotNet/djfoxer.PerformanceDotNet.Common/FileStreamBenchmark.cs b/src/djfoxer.PerformanceDotNet/djfoxer.PerformanceDotNet.Common/FileStreamBenchmark.cs index 0f006ab..f35bce2 100644 --- a/src/djfoxer.PerformanceDotNet/djfoxer.PerformanceDotNet.Common/FileStreamBenchmark.cs +++ b/src/djfoxer.PerformanceDotNet/djfoxer.PerformanceDotNet.Common/FileStreamBenchmark.cs @@ -7,9 +7,9 @@ namespace djfoxer.PerformanceDotNet.Common { public class FileStreamBenchmark : BaseBenchmark { - static int FileSize = 1_000_000; - static string _fileName = "file.txt"; - byte[] _buffer = new byte[8_000]; + const int FileSize = 1_000_000; + const string _fileName = "file.txt"; + readonly byte[] _buffer = new byte[8_000]; [GlobalSetup(Target = nameof(ReadAsync))] public void SetupRead() => File.WriteAllBytes(_fileName, new byte[FileSize]); diff --git a/src/djfoxer.PerformanceDotNet/djfoxer.PerformanceDotNet.Common/MainBenchmark.cs b/src/djfoxer.PerformanceDotNet/djfoxer.PerformanceDotNet.Common/MainBenchmark.cs index 39a6198..88b0619 100644 --- a/src/djfoxer.PerformanceDotNet/djfoxer.PerformanceDotNet.Common/MainBenchmark.cs +++ b/src/djfoxer.PerformanceDotNet/djfoxer.PerformanceDotNet.Common/MainBenchmark.cs @@ -12,18 +12,20 @@ namespace djfoxer.PerformanceDotNet.Common public class MainBenchmark : BaseBenchmark { - IEnumerable _tenMillionToZero = Enumerable.Range(0, 10_000_000).Reverse(); - byte[] _rawBytes = new byte[100 * 1024 * 1024]; - HashAlgorithm _sha = SHA256.Create(); - static string StringToTest = "abcdefghijklmnopqrstuvwxyz"; - List _books = null; + readonly IEnumerable _tenMillionToZero = Enumerable.Range(0, 10_000_000).Reverse(); + readonly byte[] _rawBytes = new byte[100 * 1024 * 1024]; + readonly HashAlgorithm _sha = SHA256.Create(); + const string StringToTest = "abcdefghijklmnopqrstuvwxyz"; + readonly List _books = new List(); [GlobalSetup] public void BenchmarkSetup() { + //Sha256 for (int index = 0; index < _rawBytes.Length; index++) _rawBytes[index] = (byte)index; - _books = new List(); + //Deserialize + _books.Clear(); for (int i = 0; i < 1_00000; i++) { string id = i.ToString(); @@ -31,9 +33,6 @@ public void BenchmarkSetup() } } - [Benchmark] - public DayOfWeek EnumParse() => (DayOfWeek)Enum.Parse(typeof(DayOfWeek), "Thursday"); - [Benchmark] public int LinqOrderBySkipFirst() { @@ -67,5 +66,7 @@ public object Deserialize() return formatter.Deserialize(mem); } + + } } diff --git a/src/djfoxer.PerformanceDotNet/djfoxer.PerformanceDotNet.Common/ParseBenchmark.cs b/src/djfoxer.PerformanceDotNet/djfoxer.PerformanceDotNet.Common/ParseBenchmark.cs new file mode 100644 index 0000000..3e029de --- /dev/null +++ b/src/djfoxer.PerformanceDotNet/djfoxer.PerformanceDotNet.Common/ParseBenchmark.cs @@ -0,0 +1,21 @@ +using BenchmarkDotNet.Attributes; +using djfoxer.PerformanceDotNet.Common.Helpers; +using System; +using System.Linq; +using System.Numerics; + +namespace djfoxer.PerformanceDotNet.Common +{ + public class ParseBenchmark : BaseBenchmark + { + string _bingIntToParse; + [GlobalSetup(Target = nameof(ParseBigInt))] + public void SetupRead() => _bingIntToParse = string.Concat(Enumerable.Repeat("654719003", 50)); + + [Benchmark] + public DayOfWeek EnumParse() => (DayOfWeek)Enum.Parse(typeof(DayOfWeek), "Thursday"); + + [Benchmark] + public BigInteger ParseBigInt() => BigInteger.Parse(_bingIntToParse); + } +} diff --git a/src/djfoxer.PerformanceDotNet/djfoxer.PerformanceDotNet.Common/djfoxer.PerformanceDotNet.Common.csproj b/src/djfoxer.PerformanceDotNet/djfoxer.PerformanceDotNet.Common/djfoxer.PerformanceDotNet.Common.csproj index 7bfcf20..e78da62 100644 --- a/src/djfoxer.PerformanceDotNet/djfoxer.PerformanceDotNet.Common/djfoxer.PerformanceDotNet.Common.csproj +++ b/src/djfoxer.PerformanceDotNet/djfoxer.PerformanceDotNet.Common/djfoxer.PerformanceDotNet.Common.csproj @@ -3,7 +3,7 @@ netstandard2.0 x64 - 1.2.0 + 1.2.2 djfoxer djfoxer