Skip to content

Instantly share code, notes, and snippets.

@MichalBrylka
Created February 22, 2023 13:21
Show Gist options
  • Save MichalBrylka/2db936f763944acbf22d128358ac9ba8 to your computer and use it in GitHub Desktop.
Save MichalBrylka/2db936f763944acbf22d128358ac9ba8 to your computer and use it in GitHub Desktop.
TestLoggerCallsPerf
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);
}
using BenchmarkDotNet.Running;
using TestLoggerCallsPerf;
BenchmarkRunner.Run<LogCallBenchmarks>();
<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