Skip to content

Commit ddef2ed

Browse files
authored
Fix: Splat.NLog - Faster with switch on Enum value, than dictionary lookup (#1257)
1 parent 4329977 commit ddef2ed

File tree

4 files changed

+26
-29
lines changed

4 files changed

+26
-29
lines changed

src/Splat.NLog/NLogLogger.cs

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
// The .NET Foundation licenses this file to you under the MIT license.
44
// See the LICENSE file in the project root for full license information.
55

6-
using System.Collections.Immutable;
76
using System.Diagnostics;
87
using System.Globalization;
98

@@ -15,17 +14,6 @@ namespace Splat.NLog;
1514
[DebuggerDisplay("Name={_inner.Name} Level={Level}")]
1615
public sealed class NLogLogger : IFullLogger, IDisposable
1716
{
18-
private static readonly KeyValuePair<LogLevel, global::NLog.LogLevel>[] _mappings =
19-
[
20-
new(LogLevel.Debug, global::NLog.LogLevel.Debug),
21-
new(LogLevel.Info, global::NLog.LogLevel.Info),
22-
new(LogLevel.Warn, global::NLog.LogLevel.Warn),
23-
new(LogLevel.Error, global::NLog.LogLevel.Error),
24-
new(LogLevel.Fatal, global::NLog.LogLevel.Fatal),
25-
];
26-
27-
private static readonly ImmutableDictionary<LogLevel, global::NLog.LogLevel> _mappingsDictionary = _mappings.ToImmutableDictionary();
28-
2917
private readonly global::NLog.Logger _inner;
3018

3119
/// <summary>
@@ -47,34 +35,34 @@ public LogLevel Level
4735
}
4836

4937
/// <inheritdoc />
50-
public bool IsDebugEnabled => _inner.IsEnabled(global::NLog.LogLevel.Debug);
38+
public bool IsDebugEnabled => _inner.IsDebugEnabled;
5139

5240
/// <inheritdoc />
53-
public bool IsInfoEnabled => _inner.IsEnabled(global::NLog.LogLevel.Info);
41+
public bool IsInfoEnabled => _inner.IsInfoEnabled;
5442

5543
/// <inheritdoc />
56-
public bool IsWarnEnabled => _inner.IsEnabled(global::NLog.LogLevel.Warn);
44+
public bool IsWarnEnabled => _inner.IsWarnEnabled;
5745

5846
/// <inheritdoc />
59-
public bool IsErrorEnabled => _inner.IsEnabled(global::NLog.LogLevel.Error);
47+
public bool IsErrorEnabled => _inner.IsErrorEnabled;
6048

6149
/// <inheritdoc />
62-
public bool IsFatalEnabled => _inner.IsEnabled(global::NLog.LogLevel.Fatal);
50+
public bool IsFatalEnabled => _inner.IsFatalEnabled;
6351

6452
/// <inheritdoc />
6553
public void Dispose() => _inner.LoggerReconfigured -= OnInnerLoggerReconfigured;
6654

6755
/// <inheritdoc />
68-
public void Write(string message, LogLevel logLevel) => _inner.Log(_mappingsDictionary[logLevel], message);
56+
public void Write(string message, LogLevel logLevel) => _inner.Log(ResolveLogLevel(logLevel), message);
6957

7058
/// <inheritdoc />
71-
public void Write(Exception exception, string message, LogLevel logLevel) => _inner.Log(_mappingsDictionary[logLevel], exception, message);
59+
public void Write(Exception exception, string message, LogLevel logLevel) => _inner.Log(ResolveLogLevel(logLevel), exception, message);
7260

7361
/// <inheritdoc />
74-
public void Write(string message, Type type, LogLevel logLevel) => LogResolver.Resolve(type).Log(_mappingsDictionary[logLevel], message);
62+
public void Write(string message, Type type, LogLevel logLevel) => LogResolver.Resolve(type).Log(ResolveLogLevel(logLevel), message);
7563

7664
/// <inheritdoc />
77-
public void Write(Exception exception, string message, Type type, LogLevel logLevel) => LogResolver.Resolve(type).Log(_mappingsDictionary[logLevel], exception, message);
65+
public void Write(Exception exception, string message, Type type, LogLevel logLevel) => LogResolver.Resolve(type).Log(ResolveLogLevel(logLevel), exception, message);
7866

7967
/// <inheritdoc/>
8068
public void Debug<TArgument>(string message, TArgument args) => _inner.Debug(CultureInfo.InvariantCulture, message, args);
@@ -556,6 +544,16 @@ public LogLevel Level
556544
/// <inheritdoc/>
557545
public void Fatal<TArgument1, TArgument2, TArgument3, TArgument4, TArgument5, TArgument6, TArgument7, TArgument8, TArgument9, TArgument10>(Exception exception, string messageFormat, TArgument1 argument1, TArgument2 argument2, TArgument3 argument3, TArgument4 argument4, TArgument5 argument5, TArgument6 argument6, TArgument7 argument7, TArgument8 argument8, TArgument9 argument9, TArgument10 argument10) => _inner.Fatal(exception, messageFormat, argument1, argument2, argument3, argument4, argument5, argument6, argument7, argument8, argument9, argument10);
558546

547+
private static global::NLog.LogLevel ResolveLogLevel(LogLevel logLevel) => logLevel switch
548+
{
549+
LogLevel.Debug => global::NLog.LogLevel.Debug,
550+
LogLevel.Info => global::NLog.LogLevel.Info,
551+
LogLevel.Warn => global::NLog.LogLevel.Warn,
552+
LogLevel.Error => global::NLog.LogLevel.Error,
553+
LogLevel.Fatal => global::NLog.LogLevel.Fatal,
554+
_ => throw new ArgumentException($"Unknown LogLevel {logLevel}", nameof(logLevel)),
555+
};
556+
559557
private void OnInnerLoggerReconfigured(object? sender, EventArgs e) => SetLogLevel();
560558

561559
/// <summary>
@@ -566,11 +564,11 @@ public LogLevel Level
566564
/// </remarks>
567565
private void SetLogLevel()
568566
{
569-
foreach (var mapping in _mappings)
567+
foreach (LogLevel logLevel in Enum.GetValues(typeof(LogLevel)))
570568
{
571-
if (_inner.IsEnabled(mapping.Value))
569+
if (_inner.IsEnabled(ResolveLogLevel(logLevel)))
572570
{
573-
Level = mapping.Key;
571+
Level = logLevel;
574572
return;
575573
}
576574
}

src/Splat.NLog/Splat.NLog.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
</PropertyGroup>
1111
<ItemGroup>
1212
<PackageReference Include="NLog" />
13-
<PackageReference Include="System.Collections.Immutable" />
1413
</ItemGroup>
1514
<ItemGroup>
1615
<ProjectReference Include="..\Splat\Splat.csproj" />

src/Splat/Logging/ILogger.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,15 @@ public interface ILogger
3333
void Write(Exception exception, [Localizable(false)] string message, LogLevel logLevel);
3434

3535
/// <summary>
36-
/// Writes a messge to the target.
36+
/// Writes a message to the target.
3737
/// </summary>
3838
/// <param name="message">The message.</param>
3939
/// <param name="type">The type.</param>
4040
/// <param name="logLevel">The log level.</param>
4141
void Write([Localizable(false)] string message, [Localizable(false)] Type type, LogLevel logLevel);
4242

4343
/// <summary>
44-
/// Writes a messge to the target.
44+
/// Writes a message to the target.
4545
/// </summary>
4646
/// <param name="exception">The exception that occured.</param>
4747
/// <param name="message">The message.</param>

src/Splat/Logging/IStaticFullLogger.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ public interface IStaticFullLogger
341341
void Write(Exception exception, [Localizable(false)] string message, LogLevel logLevel, [CallerMemberName]string? callerMemberName = null);
342342

343343
/// <summary>
344-
/// Writes a messge to the target.
344+
/// Writes a message to the target.
345345
/// </summary>
346346
/// <param name="message">The message.</param>
347347
/// <param name="type">The type.</param>
@@ -350,7 +350,7 @@ public interface IStaticFullLogger
350350
void Write([Localizable(false)] string message, [Localizable(false)] Type type, LogLevel logLevel, [CallerMemberName]string? callerMemberName = null);
351351

352352
/// <summary>
353-
/// Writes a messge to the target.
353+
/// Writes a message to the target.
354354
/// </summary>
355355
/// <param name="exception">The exception that occured.</param>
356356
/// <param name="message">The message.</param>

0 commit comments

Comments
 (0)