From c72855b61069c247d686333a2ec5190db43c3797 Mon Sep 17 00:00:00 2001 From: Aaron Stannard Date: Tue, 11 Jul 2023 14:39:32 -0500 Subject: [PATCH] added req/s reporting for macro-benchmarks (#6829) * added req/s reporting for macro-benchmarks * increase iteration counts * fixed compilation error --- .../Actor/PingPongBenchmarks.cs | 8 ++-- .../Akka.Benchmarks/Configurations/Configs.cs | 42 +++++++++++++++++-- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/benchmark/Akka.Benchmarks/Actor/PingPongBenchmarks.cs b/src/benchmark/Akka.Benchmarks/Actor/PingPongBenchmarks.cs index e41f82cc8fe..cfb8187edd7 100644 --- a/src/benchmark/Akka.Benchmarks/Actor/PingPongBenchmarks.cs +++ b/src/benchmark/Akka.Benchmarks/Actor/PingPongBenchmarks.cs @@ -16,7 +16,7 @@ namespace Akka.Benchmarks.Actor { [Config(typeof(MonitoringConfig))] - [SimpleJob(RunStrategy.Monitoring, launchCount: 3, warmupCount: 3, targetCount: 3)] + [SimpleJob(RunStrategy.Monitoring, launchCount: 10, warmupCount: 10, targetCount: 10)] public class PingPongBenchmarks { public const int Operations = 1_000_000; @@ -24,7 +24,7 @@ public class PingPongBenchmarks private ActorSystem system; private IActorRef ping; - [GlobalSetup] + [IterationSetup] public void Setup() { timeout = TimeSpan.FromMinutes(1); @@ -33,13 +33,13 @@ public void Setup() ping = system.ActorOf(Props.Create(() => new Ping(pong))); } - [GlobalCleanup] + [IterationCleanup] public void Cleanup() { system.Dispose(); } - [Benchmark(OperationsPerInvoke = Operations)] + [Benchmark(OperationsPerInvoke = Operations * 2)] public async Task Actor_ping_pong_single_pair_in_memory() { await ping.Ask(StartTest.Instance, timeout); diff --git a/src/benchmark/Akka.Benchmarks/Configurations/Configs.cs b/src/benchmark/Akka.Benchmarks/Configurations/Configs.cs index 4217cdefcf3..d07c6833556 100644 --- a/src/benchmark/Akka.Benchmarks/Configurations/Configs.cs +++ b/src/benchmark/Akka.Benchmarks/Configurations/Configs.cs @@ -5,13 +5,48 @@ // //----------------------------------------------------------------------- +using System.Reflection; +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Columns; using BenchmarkDotNet.Configs; using BenchmarkDotNet.Diagnosers; using BenchmarkDotNet.Exporters; using BenchmarkDotNet.Loggers; +using BenchmarkDotNet.Reports; +using BenchmarkDotNet.Running; namespace Akka.Benchmarks.Configurations { + public class RequestsPerSecondColumn : IColumn + { + public string Id => nameof(RequestsPerSecondColumn); + public string ColumnName => "Req/sec"; + + public bool IsDefault(Summary summary, BenchmarkCase benchmarkCase) => false; + public string GetValue(Summary summary, BenchmarkCase benchmarkCase) => GetValue(summary, benchmarkCase, null); + public bool IsAvailable(Summary summary) => true; + public bool AlwaysShow => true; + public ColumnCategory Category => ColumnCategory.Custom; + public int PriorityInCategory => -1; + public bool IsNumeric => true; + public UnitType UnitType => UnitType.Dimensionless; + public string Legend => "Requests per Second"; + + public string GetValue(Summary summary, BenchmarkCase benchmarkCase, SummaryStyle style) + { + var benchmarkAttribute = benchmarkCase.Descriptor.WorkloadMethod.GetCustomAttribute(); + var totalOperations = benchmarkAttribute?.OperationsPerInvoke ?? 1; + + var report = summary[benchmarkCase]; + var nsPerOperation = report.ResultStatistics.Mean; + var operationsPerSecond = 1 / (nsPerOperation / 1e9); + + + return operationsPerSecond.ToString("N2"); // or format as you like + } + } + + /// /// Basic BenchmarkDotNet configuration used for microbenchmarks. /// @@ -19,8 +54,8 @@ public class MicroBenchmarkConfig : ManualConfig { public MicroBenchmarkConfig() { - this.Add(MemoryDiagnoser.Default); - this.Add(MarkdownExporter.GitHub); + AddDiagnoser(MemoryDiagnoser.Default); + AddExporter(MarkdownExporter.GitHub); AddLogger(ConsoleLogger.Default); } } @@ -32,7 +67,8 @@ public class MonitoringConfig : ManualConfig { public MonitoringConfig() { - this.Add(MarkdownExporter.GitHub); + AddExporter(MarkdownExporter.GitHub); + AddColumn(new RequestsPerSecondColumn()); } } }