From 782fcac33c85fb3769ca1e2b8025d1f40e2aaf3c Mon Sep 17 00:00:00 2001 From: Martin Tomka Date: Mon, 7 Aug 2023 09:41:46 +0200 Subject: [PATCH] Improve `MultipleStrategiesBenchmark` --- ...ltipleStrategiesBenchmark-report-github.md | 21 +++++++++-------- .../MultipleStrategiesBenchmark.cs | 23 +++++++++++++++---- .../Utils/Helper.MultipleStrategies.cs | 14 +++++++---- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/bench/BenchmarkDotNet.Artifacts/results/Polly.Core.Benchmarks.MultipleStrategiesBenchmark-report-github.md b/bench/BenchmarkDotNet.Artifacts/results/Polly.Core.Benchmarks.MultipleStrategiesBenchmark-report-github.md index 3e9b2cb868c..2cf83fd22b8 100644 --- a/bench/BenchmarkDotNet.Artifacts/results/Polly.Core.Benchmarks.MultipleStrategiesBenchmark-report-github.md +++ b/bench/BenchmarkDotNet.Artifacts/results/Polly.Core.Benchmarks.MultipleStrategiesBenchmark-report-github.md @@ -1,17 +1,18 @@ -``` ini +``` -BenchmarkDotNet=v0.13.5, OS=Windows 11 (10.0.22621.1848/22H2/2022Update/SunValley2), VM=Hyper-V +BenchmarkDotNet v0.13.6, Windows 11 (10.0.22621.1992/22H2/2022Update/SunValley2) (Hyper-V) Intel Xeon Platinum 8370C CPU 2.80GHz, 1 CPU, 16 logical and 8 physical cores -.NET SDK=7.0.304 - [Host] : .NET 7.0.7 (7.0.723.27404), X64 RyuJIT AVX2 +.NET SDK 7.0.306 + [Host] : .NET 7.0.9 (7.0.923.32018), X64 RyuJIT AVX2 Job=MediumRun Toolchain=InProcessEmitToolchain IterationCount=15 LaunchCount=2 WarmupCount=10 ``` -| Method | Mean | Error | StdDev | Ratio | Gen0 | Allocated | Alloc Ratio | -|-------------------------------------- |---------:|----------:|----------:|------:|-------:|----------:|------------:| -| ExecuteStrategyPipeline_V7 | 2.349 μs | 0.0232 μs | 0.0318 μs | 1.00 | 0.1106 | 2824 B | 1.00 | -| ExecuteStrategyPipeline_V8 | 1.968 μs | 0.0104 μs | 0.0149 μs | 0.84 | - | 40 B | 0.01 | -| ExecuteStrategyPipeline_Telemetry_V8 | 3.014 μs | 0.0137 μs | 0.0204 μs | 1.28 | - | 40 B | 0.01 | -| ExecuteStrategyPipeline_NonGeneric_V8 | 2.188 μs | 0.0107 μs | 0.0156 μs | 0.93 | - | 40 B | 0.01 | +| Method | Mean | Error | StdDev | Ratio | RatioSD | Gen0 | Allocated | Alloc Ratio | +|----------------------------------------------- |---------:|----------:|----------:|------:|--------:|-------:|----------:|------------:| +| ExecuteStrategyPipeline_Generic_V7 | 2.318 μs | 0.0253 μs | 0.0355 μs | 1.00 | 0.00 | 0.1106 | 2824 B | 1.00 | +| ExecuteStrategyPipeline_Generic_V8 | 2.044 μs | 0.0095 μs | 0.0140 μs | 0.88 | 0.02 | - | 72 B | 0.03 | +| ExecuteStrategyPipeline_GenericTelemetry_V8 | 2.950 μs | 0.0059 μs | 0.0089 μs | 1.27 | 0.02 | - | 72 B | 0.03 | +| ExecuteStrategyPipeline_NonGeneric_V8 | 2.295 μs | 0.0176 μs | 0.0264 μs | 0.99 | 0.01 | - | 72 B | 0.03 | +| ExecuteStrategyPipeline_NonGenericTelemetry_V8 | 3.153 μs | 0.0058 μs | 0.0085 μs | 1.36 | 0.02 | - | 72 B | 0.03 | diff --git a/bench/Polly.Core.Benchmarks/MultipleStrategiesBenchmark.cs b/bench/Polly.Core.Benchmarks/MultipleStrategiesBenchmark.cs index 71f33aa79e6..6494fe08d88 100644 --- a/bench/Polly.Core.Benchmarks/MultipleStrategiesBenchmark.cs +++ b/bench/Polly.Core.Benchmarks/MultipleStrategiesBenchmark.cs @@ -9,6 +9,7 @@ public class MultipleStrategiesBenchmark private object? _strategyV8; private object? _strategyTelemetryV8; private ResilienceStrategy? _nonGeneric; + private ResilienceStrategy? _nonGenericTelemetry; [GlobalSetup] public void Setup() @@ -17,20 +18,21 @@ public void Setup() _strategyV7 = Helper.CreateStrategyPipeline(PollyVersion.V7, false); _strategyV8 = Helper.CreateStrategyPipeline(PollyVersion.V8, false); _strategyTelemetryV8 = Helper.CreateStrategyPipeline(PollyVersion.V8, true); - _nonGeneric = Helper.CreateNonGenericStrategyPipeline(); + _nonGeneric = Helper.CreateNonGenericStrategyPipeline(telemetry: false); + _nonGenericTelemetry = Helper.CreateNonGenericStrategyPipeline(telemetry: true); } [GlobalCleanup] public void Cleanup() => _meterListener?.Dispose(); [Benchmark(Baseline = true)] - public ValueTask ExecuteStrategyPipeline_V7() => _strategyV7!.ExecuteAsync(PollyVersion.V7); + public ValueTask ExecuteStrategyPipeline_Generic_V7() => _strategyV7!.ExecuteAsync(PollyVersion.V7); [Benchmark] - public ValueTask ExecuteStrategyPipeline_V8() => _strategyV8!.ExecuteAsync(PollyVersion.V8); + public ValueTask ExecuteStrategyPipeline_Generic_V8() => _strategyV8!.ExecuteAsync(PollyVersion.V8); [Benchmark] - public ValueTask ExecuteStrategyPipeline_Telemetry_V8() => _strategyTelemetryV8!.ExecuteAsync(PollyVersion.V8); + public ValueTask ExecuteStrategyPipeline_GenericTelemetry_V8() => _strategyTelemetryV8!.ExecuteAsync(PollyVersion.V8); [Benchmark] public async ValueTask ExecuteStrategyPipeline_NonGeneric_V8() @@ -44,4 +46,17 @@ public async ValueTask ExecuteStrategyPipeline_NonGeneric_V8() ResilienceContextPool.Shared.Return(context); } + + [Benchmark] + public async ValueTask ExecuteStrategyPipeline_NonGenericTelemetry_V8() + { + var context = ResilienceContextPool.Shared.Get(); + + await _nonGenericTelemetry!.ExecuteOutcomeAsync( + static (_, _) => new ValueTask>(Outcome.FromResult("dummy")), + context, + string.Empty).ConfigureAwait(false); + + ResilienceContextPool.Shared.Return(context); + } } diff --git a/bench/Polly.Core.Benchmarks/Utils/Helper.MultipleStrategies.cs b/bench/Polly.Core.Benchmarks/Utils/Helper.MultipleStrategies.cs index 1ce8c58c827..1e9b2dcc813 100644 --- a/bench/Polly.Core.Benchmarks/Utils/Helper.MultipleStrategies.cs +++ b/bench/Polly.Core.Benchmarks/Utils/Helper.MultipleStrategies.cs @@ -57,9 +57,9 @@ internal static partial class Helper _ => throw new NotSupportedException() }; - public static ResilienceStrategy CreateNonGenericStrategyPipeline() + public static ResilienceStrategy CreateNonGenericStrategyPipeline(bool telemetry) { - return new CompositeStrategyBuilder() + var builder = new CompositeStrategyBuilder() .AddConcurrencyLimiter(new ConcurrencyLimiterOptions { QueueLimit = 10, @@ -91,7 +91,13 @@ public static ResilienceStrategy CreateNonGenericStrategyPipeline() { Result: string result } when result == Failure => PredicateResult.True, _ => PredicateResult.False } - }) - .Build(); + }); + + if (telemetry) + { + builder.ConfigureTelemetry(NullLoggerFactory.Instance); + } + + return builder.Build(); } }