Created
February 22, 2023 13:21
-
-
Save MichalBrylka/2db936f763944acbf22d128358ac9ba8 to your computer and use it in GitHub Desktop.
TestLoggerCallsPerf
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using BenchmarkDotNet.Attributes; | |
using Serilog; | |
namespace TestLoggerCallsPerf; | |
/*Console | |
| Method | Mean | Error | StdDev | Ratio | RatioSD | Allocated | Alloc Ratio | | |
|----------- |---------:|--------:|---------:|------:|--------:|----------:|------------:| | |
| ParamsArgs | 477.0 ms | 8.56 ms | 8.01 ms | 1.00 | 0.00 | 3.75 MB | 1.00 | | |
| Generic | 451.0 ms | 8.92 ms | 17.40 ms | 0.95 | 0.03 | 3.75 MB | 1.00 | | |
File | |
| Method | Mean | Error | StdDev | Ratio | Gen0 | Allocated | Alloc Ratio | | |
|----------- |---------:|---------:|---------:|------:|---------:|----------:|------------:| | |
| ParamsArgs | 30.44 ms | 0.358 ms | 0.335 ms | 1.00 | 343.7500 | 2.19 MB | 1.00 | | |
| Generic | 29.83 ms | 0.129 ms | 0.121 ms | 0.98 | 343.7500 | 2.19 MB | 1.00 | | |
*/ | |
[MemoryDiagnoser] | |
public class LogCallBenchmarks | |
{ | |
private LogAbstraction _paramsArgsLogger; | |
private LogAbstractionGeneric _genericArgsLogger; | |
[GlobalSetup] | |
public void Setup() | |
{ | |
var serilog1 = new LoggerConfiguration() | |
//.MinimumLevel.Error() | |
//.WriteTo.Console() | |
.WriteTo.File(new Serilog.Formatting.Compact.CompactJsonFormatter(), $"log{DateTime.Now:yyyyMMddHHmmss}_1.txt") | |
.CreateLogger(); | |
var serilog2 = new LoggerConfiguration() | |
//.MinimumLevel.Error() | |
//.WriteTo.Console() | |
.WriteTo.File(new Serilog.Formatting.Compact.CompactJsonFormatter(), $"log{DateTime.Now:yyyyMMddHHmmss}_2.txt") | |
.CreateLogger(); | |
_paramsArgsLogger = new(serilog1); | |
_genericArgsLogger = new(serilog2); | |
object o1 = "ABC", o3 = 3.14; | |
_paramsArgsLogger.Info(MESSAGE_TEMPLATE_1, o1); | |
_paramsArgsLogger.Info(MESSAGE_TEMPLATE_2, o1, 10); | |
_paramsArgsLogger.Info(MESSAGE_TEMPLATE_3, o1, 10, o3); | |
_genericArgsLogger.Info(MESSAGE_TEMPLATE_1, o1); | |
_genericArgsLogger.Info(MESSAGE_TEMPLATE_2, o1, 10); | |
_genericArgsLogger.Info(MESSAGE_TEMPLATE_3, o1, 10, o3); | |
} | |
const string MESSAGE_TEMPLATE_1 = "{String}"; | |
const string MESSAGE_TEMPLATE_2 = "{String} {Int}"; | |
const string MESSAGE_TEMPLATE_3 = "{String} {Int} {Double}"; | |
const int N = 100; | |
[Benchmark(Baseline = true)] | |
public void ParamsArgs() | |
{ | |
object o1 = "ABC", o3 = 3.14; | |
for (int i = 0; i < N; i++) | |
{ | |
_paramsArgsLogger.Info(MESSAGE_TEMPLATE_1, o1); | |
_paramsArgsLogger.Info(MESSAGE_TEMPLATE_2, o1, i); | |
_paramsArgsLogger.Info(MESSAGE_TEMPLATE_3, o1, i, o3); | |
} | |
} | |
[Benchmark] | |
public void Generic() | |
{ | |
object o1 = "ABC", o3 = 3.14; | |
for (int i = 0; i < N; i++) | |
{ | |
_genericArgsLogger.Info(MESSAGE_TEMPLATE_1, o1); | |
_genericArgsLogger.Info(MESSAGE_TEMPLATE_2, o1, i); | |
_genericArgsLogger.Info(MESSAGE_TEMPLATE_3, o1, i, o3); | |
} | |
} | |
} | |
class LogAbstraction | |
{ | |
private readonly ILogger _logger; | |
public LogAbstraction(ILogger logger) => _logger = logger; | |
public void Info(string message, object o1) => | |
_logger.Information(message, o1); | |
public void Info(string message, object o1, object o2) => | |
_logger.Information(message, o1, o2); | |
public void Info(string message, object o1, object o2, object o3) => | |
_logger.Information(message, o1, o2, o3); | |
} | |
class LogAbstractionGeneric | |
{ | |
private readonly ILogger _logger; | |
public LogAbstractionGeneric(ILogger logger) => _logger = logger; | |
public void Info(string message, object o1) => | |
_logger.Information<object>(message, o1); | |
public void Info(string message, object o1, object o2) => | |
_logger.Information<object, object>(message, o1, o2); | |
public void Info(string message, object o1, object o2, object o3) => | |
_logger.Information<object, object, object>(message, o1, o2, o3); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using BenchmarkDotNet.Running; | |
using TestLoggerCallsPerf; | |
BenchmarkRunner.Run<LogCallBenchmarks>(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<Project Sdk="Microsoft.NET.Sdk"> | |
<PropertyGroup> | |
<TargetFramework>net461</TargetFramework> | |
<LangVersion>11.0</LangVersion> | |
<OutputType>Exe</OutputType> | |
</PropertyGroup> | |
<PropertyGroup> | |
<PlatformTarget>AnyCPU</PlatformTarget> | |
<DebugType>pdbonly</DebugType> | |
<DebugSymbols>true</DebugSymbols> | |
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> | |
<Optimize>true</Optimize> | |
<IsPackable>false</IsPackable> | |
</PropertyGroup> | |
<ItemGroup> | |
<PackageReference Include="BenchmarkDotNet" Version="0.13.5" /> | |
<PackageReference Include="Serilog" Version="2.12.0" /> | |
<PackageReference Include="Serilog.Formatting.Compact" Version="1.1.0" /> | |
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" /> | |
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" /> | |
</ItemGroup> | |
</Project> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment