From 7aa80cfed68fac760bb8208b5c0a8a88074ac2c6 Mon Sep 17 00:00:00 2001 From: Mitchell Barry Date: Sat, 2 Nov 2024 03:28:54 +0000 Subject: [PATCH] WIP adding BenchmarkDotNet --- .vscode/launch.json | 11 +++++++ .vscode/tasks.json | 14 +++++++++ src/ConsoleApp/BenchmarkService.cs | 29 +++++++++++++++++++ src/ConsoleApp/Program.cs | 12 +++++++- .../Services/ClientCredentialService.cs | 4 +-- src/ConsoleApp/Services/DemoService.cs | 4 +-- 6 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 src/ConsoleApp/BenchmarkService.cs diff --git a/.vscode/launch.json b/.vscode/launch.json index aacab3f..bc9cd2b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -11,6 +11,17 @@ "cwd": "${workspaceFolder}/src/ConsoleApp", "stopAtEntry": false, "console": "internalConsole" + }, + { + "name": "Benchmark", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build:release", + "program": "${workspaceFolder}/src/ConsoleApp/bin/Release/net9.0/ConsoleApp.dll", + "args": [ "--benchmark", "true" ], + "cwd": "${workspaceFolder}/src/ConsoleApp", + "stopAtEntry": false, + "console": "internalConsole" } ] } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 1e3e56a..8597eb0 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -12,6 +12,20 @@ "/consoleloggerparameters:NoSummary;ForceNoAlign" ], "problemMatcher": "$msCompile" + }, + { + "label": "build:release", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/src/dotnet-basic-console.sln", + "-c", + "Release", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary;ForceNoAlign" + ], + "problemMatcher": "$msCompile" } ] } \ No newline at end of file diff --git a/src/ConsoleApp/BenchmarkService.cs b/src/ConsoleApp/BenchmarkService.cs new file mode 100644 index 0000000..c1a8bf8 --- /dev/null +++ b/src/ConsoleApp/BenchmarkService.cs @@ -0,0 +1,29 @@ +using BenchmarkDotNet.Attributes; +using ConsoleApp.Models.Configuration; +using ConsoleApp.Services; +using Microsoft.Extensions.Options; + +namespace ConsoleApp; + +public class BenchmarkService( + IDemoService demoService, + IOptions options) +{ + private readonly IDemoService _demoService = demoService; + private readonly IOptions _options = options; + + [GlobalSetup] + public void Setup() + { + // initialize things in class if needed + } + + [Benchmark] + public void WriteWelcomeMessage() + { + for (var i = 0; i < 100; i++) + { + _demoService.WriteWelcomeMessage(); + } + } +} diff --git a/src/ConsoleApp/Program.cs b/src/ConsoleApp/Program.cs index eb48cea..32622a6 100644 --- a/src/ConsoleApp/Program.cs +++ b/src/ConsoleApp/Program.cs @@ -9,6 +9,7 @@ using Microsoft.Identity.Client; using Serilog; using OpenTelemetry.Logs; +using BenchmarkDotNet.Running; var builder = Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostContext, configBuilder) => @@ -54,4 +55,13 @@ using var host = builder.Build(); -await host.RunAsync(); +var configuration = host.Services.GetRequiredService(); + +if (configuration.GetValue("benchmark") == true) +{ + BenchmarkRunner.Run(); +} +else +{ + await host.RunAsync(); +} diff --git a/src/ConsoleApp/Services/ClientCredentialService.cs b/src/ConsoleApp/Services/ClientCredentialService.cs index 6df1bd1..114dd54 100644 --- a/src/ConsoleApp/Services/ClientCredentialService.cs +++ b/src/ConsoleApp/Services/ClientCredentialService.cs @@ -4,13 +4,13 @@ namespace ConsoleApp.Services; -internal interface IClientCredentialService +public interface IClientCredentialService { Task GetAuthenticationResult(IEnumerable? scopes = null); Task GetAccessToken(IEnumerable? scopes = null); } -internal class ClientCredentialService(ILogger logger, +public class ClientCredentialService(ILogger logger, IOptions confidentialClientApplicationOptions) : IClientCredentialService { private readonly ILogger _logger = logger; diff --git a/src/ConsoleApp/Services/DemoService.cs b/src/ConsoleApp/Services/DemoService.cs index 0d5776b..13e30dc 100644 --- a/src/ConsoleApp/Services/DemoService.cs +++ b/src/ConsoleApp/Services/DemoService.cs @@ -6,13 +6,13 @@ namespace ConsoleApp.Services; -internal interface IDemoService +public interface IDemoService { void WriteWelcomeMessage(); Task MakeGraphApiCall(); } -internal class DemoService(ILogger logger, +public class DemoService(ILogger logger, IClientCredentialService clientCredentialService, IOptions consoleAppSettings, IHttpClientFactory httpClientFactory) : IDemoService