Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions sandbox/Benchmark/Benchmark.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.13.10" />
<PackageReference Include="BenchmarkDotNet" Version="0.15.4" />
<PackageReference Include="log4net" Version="2.0.15" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.0" />
<PackageReference Include="NLog" Version="5.2.5" />
<PackageReference Include="NLog.Extensions.Logging" Version="5.3.5" />
<PackageReference Include="NLog" Version="6.0.5" />
<PackageReference Include="NLog.Extensions.Logging" Version="6.0.5" />
<PackageReference Include="Serilog" Version="3.1.1" />
<PackageReference Include="Serilog.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="Serilog.Sinks.Async" Version="1.5.0" />
Expand Down
129 changes: 68 additions & 61 deletions sandbox/Benchmark/Benchmarks/PostLogEntry.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
Expand Down Expand Up @@ -78,19 +78,21 @@ public void Post(IZLoggerEntry log)
[Config(typeof(BenchmarkConfig))]
public class PostLogEntry
{
const int N = 10_000;

static readonly string NullDevicePath = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "NUL" : "/dev/null";

ILogger zLogger = default!;
ILogger msExtConsoleLogger = default!;
ILogger serilogAsyncMsExtLogger = default!;
ILogger serilogMsExtLogger = default!;
ILogger serilogMsExtLoggerDefault = default!;
ILogger nLogAsyncMsExtLogger = default!;
ILogger nLogMsExtLogger = default!;
ILogger nLogMsExtLoggerDefault = default!;

Serilog.Core.Logger serilogAsyncLogger = default!;
Serilog.Core.Logger serilogLogger = default!;
Serilog.Core.Logger serilogLoggerDefault = default!;
NLog.Logger nLogAsyncLogger = default!;
NLog.Logger nLogLogger = default!;
NLog.Logger nLogLoggerDefault = default!;

List<IDisposable> disposables = new();

Expand All @@ -117,74 +119,79 @@ public void SetUp()
var msExtConsoleLoggerFactory = LoggerFactory.Create(logging =>
{
logging
.AddConsole(options =>
.AddSimpleConsole(options =>
{
options.FormatterName = "BenchmarkPlainText";
})
.AddConsoleFormatter<BenchmarkPlainTextConsoleFormatter, BenchmarkPlainTextConsoleFormatter.Options>();
options.ColorBehavior = Microsoft.Extensions.Logging.Console.LoggerColorBehavior.Disabled;
options.IncludeScopes = false;
options.SingleLine = true;
options.TimestampFormat = "u";
});
});
disposables.Add(msExtConsoleLoggerFactory);

msExtConsoleLogger = msExtConsoleLoggerFactory.CreateLogger<Program>();

// Serilog

serilogAsyncLogger = new LoggerConfiguration()
.WriteTo.Async(a => a.TextWriter(TextWriter.Null), bufferSize: N)
.CreateLogger();
disposables.Add(serilogAsyncLogger);
var serilogAsyncMsExtLoggerFactory = LoggerFactory.Create(x => x.AddSerilog(serilogAsyncLogger));
serilogAsyncMsExtLogger = serilogAsyncMsExtLoggerFactory.CreateLogger<PostLogEntry>();
disposables.Add(serilogAsyncMsExtLoggerFactory);

serilogLogger = new LoggerConfiguration()
.WriteTo.Async(a => a.TextWriter(TextWriter.Null))
.WriteTo.TextWriter(TextWriter.Null)
.CreateLogger();
disposables.Add(serilogLogger);
var serilogMsExtLoggerFactory = LoggerFactory.Create(x => x.AddSerilog(serilogLogger));
serilogMsExtLogger = serilogMsExtLoggerFactory.CreateLogger<PostLogEntry>();
disposables.Add(serilogMsExtLoggerFactory);

serilogLoggerDefault = new LoggerConfiguration()
.WriteTo.TextWriter(TextWriter.Null)
.CreateLogger();
var serilogMsExtLoggerFactoryDefault = LoggerFactory.Create(x => x.AddSerilog(serilogLoggerDefault));
serilogMsExtLoggerDefault = serilogMsExtLoggerFactoryDefault.CreateLogger<PostLogEntry>();
disposables.Add(serilogMsExtLoggerFactoryDefault);

// NLog
var nLogLayout = new NLog.Layouts.SimpleLayout("${longdate} [${level}] ${message}");
{
var nLogConfig = new NLog.Config.LoggingConfiguration(new LogFactory());
var target = new NLog.Targets.FileTarget("Null")
var nLogAsyncConfig = new NLog.Config.LoggingConfiguration(new LogFactory());
var target = new NLog.Targets.NullTarget("Null Async")
{
FileName = NullDevicePath,
Layout = nLogLayout
Layout = nLogLayout,
FormatMessage = true,
};
var asyncTarget = new NLog.Targets.Wrappers.AsyncTargetWrapper(target, 10000, AsyncTargetWrapperOverflowAction.Grow)
var asyncTarget = new NLog.Targets.Wrappers.AsyncTargetWrapper(target, N, AsyncTargetWrapperOverflowAction.Grow)
{
TimeToSleepBetweenBatches = 0
};
nLogConfig.AddTarget(asyncTarget);
nLogConfig.AddRuleForAllLevels(asyncTarget);
nLogConfig.LogFactory.Configuration = nLogConfig;
nLogAsyncConfig.AddTarget(asyncTarget);
nLogAsyncConfig.AddRuleForAllLevels(asyncTarget);
nLogAsyncConfig.LogFactory.Configuration = nLogAsyncConfig;

nLogLogger = nLogConfig.LogFactory.GetLogger("NLog");
nLogAsyncLogger = nLogAsyncConfig.LogFactory.GetLogger("NLog");

var nLogMsExtLoggerFactory = LoggerFactory.Create(logging => logging.AddNLog(nLogConfig));
nLogMsExtLogger = nLogMsExtLoggerFactory.CreateLogger<PostLogEntry>();
var nLogAsyncMsExtLoggerFactory = LoggerFactory.Create(logging => logging.AddNLog(nLogAsyncConfig));
nLogAsyncMsExtLogger = nLogAsyncMsExtLoggerFactory.CreateLogger<PostLogEntry>();

disposables.Add(nLogMsExtLoggerFactory);
disposables.Add(nLogAsyncMsExtLoggerFactory);
disposables.Add(nLogAsyncConfig.LogFactory);
}
{
var nLogConfigDefault = new NLog.Config.LoggingConfiguration(new LogFactory());
var target = new NLog.Targets.FileTarget("Null:Default")
var nLogConfig = new NLog.Config.LoggingConfiguration(new LogFactory());
var target = new NLog.Targets.NullTarget("Null")
{
FileName = NullDevicePath,
Layout = nLogLayout
Layout = nLogLayout,
FormatMessage = true,
};
nLogConfigDefault.AddTarget(target);
nLogConfigDefault.AddRuleForAllLevels(target);
nLogConfigDefault.LogFactory.Configuration = nLogConfigDefault;
nLogConfig.AddTarget(target);
nLogConfig.AddRuleForAllLevels(target);
nLogConfig.LogFactory.Configuration = nLogConfig;

nLogLogger = nLogConfigDefault.LogFactory.GetLogger("NLog");
nLogLogger = nLogConfig.LogFactory.GetLogger("NLog");

var nLogMsExtLoggerFactoryDefault = LoggerFactory.Create(logging => logging.AddNLog(nLogConfigDefault));
nLogMsExtLoggerDefault = nLogMsExtLoggerFactoryDefault.CreateLogger<PostLogEntry>();
var nLogMsExtLoggerFactory = LoggerFactory.Create(logging => logging.AddNLog(nLogConfig));
nLogMsExtLogger = nLogMsExtLoggerFactory.CreateLogger<PostLogEntry>();

disposables.Add(nLogMsExtLoggerFactoryDefault);
disposables.Add(nLogMsExtLoggerFactory);
disposables.Add(nLogConfig.LogFactory);
}
}

Expand Down Expand Up @@ -222,62 +229,62 @@ public void MsExtConsole_SourceGenerator_Log()
}

[Benchmark]
public void Serilog_MsExt_Log()
public void Serilog_Async_MsExt_Log()
{
serilogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
serilogAsyncMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}

[Benchmark]
public void Serilog_MsExt_SourceGenerator_Log()
public void Serilog_Async_MsExt_SourceGenerator_Log()
{
serilogMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
serilogAsyncMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}

[Benchmark]
public void Serilog_Log()
public void Serilog_Async_Log()
{
serilogLogger.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
serilogAsyncLogger.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}

[Benchmark]
public void Serilog_Default_MsExt_Log()
public void Serilog_MsExt_Log()
{
serilogMsExtLoggerDefault.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
serilogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}

[Benchmark]
public void Serilog_Default_Log()
public void Serilog_Log()
{
serilogLoggerDefault.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
serilogLogger.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}

[Benchmark]
public void NLog_MsExt_Log()
public void NLog_Async_MsExt_Log()
{
nLogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
nLogAsyncMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}

[Benchmark]
public void NLog_MsExt_SourceGenerator_Log()
public void NLog_Async_MsExt_SourceGenerator_Log()
{
nLogMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
nLogAsyncMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}

[Benchmark]
public void NLog_Log()
public void NLog_Async_Log()
{
nLogLogger.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
nLogAsyncLogger.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}

[Benchmark]
public void NLog_Default_MsExt_Log()
public void NLog_MsExt_Log()
{
nLogMsExtLoggerDefault.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
nLogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}

[Benchmark]
public void NLog_Default_Log()
public void NLog_Log()
{
nLogLoggerDefault.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
nLogLogger.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
}
}
Loading