From b10bd444d189900131ab107d8fab71b91c0036cc Mon Sep 17 00:00:00 2001 From: rootdarkarchon Date: Sat, 16 Mar 2024 17:14:26 +0100 Subject: [PATCH] make mare even less dumpy --- MareSynchronos/Services/DalamudUtilService.cs | 16 ++++++------- .../Services/Mediator/MareMediator.cs | 23 +++++++++++++------ .../Services/PerformanceCollectorService.cs | 8 +++---- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/MareSynchronos/Services/DalamudUtilService.cs b/MareSynchronos/Services/DalamudUtilService.cs index 013a3df..b9e1e86 100644 --- a/MareSynchronos/Services/DalamudUtilService.cs +++ b/MareSynchronos/Services/DalamudUtilService.cs @@ -414,7 +414,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber { var gameObj = (GameObject*)p.Address; var drawObj = gameObj->DrawObject; - var playerName = p.Name; + var characterName = p.Name; bool isDrawing = false; bool isDrawingChanged = false; if ((nint)drawObj != IntPtr.Zero) @@ -426,20 +426,20 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber if (!isDrawing) { isDrawing = ((CharacterBase*)drawObj)->HasModelFilesInSlotLoaded != 0; - if (isDrawing && !string.Equals(_lastGlobalBlockPlayer, playerName, StringComparison.Ordinal) + if (isDrawing && !string.Equals(_lastGlobalBlockPlayer, characterName, StringComparison.Ordinal) && !string.Equals(_lastGlobalBlockReason, "HasModelFilesInSlotLoaded", StringComparison.Ordinal)) { - _lastGlobalBlockPlayer = playerName; + _lastGlobalBlockPlayer = characterName; _lastGlobalBlockReason = "HasModelFilesInSlotLoaded"; isDrawingChanged = true; } } else { - if (!string.Equals(_lastGlobalBlockPlayer, playerName, StringComparison.Ordinal) + if (!string.Equals(_lastGlobalBlockPlayer, characterName, StringComparison.Ordinal) && !string.Equals(_lastGlobalBlockReason, "HasModelInSlotLoaded", StringComparison.Ordinal)) { - _lastGlobalBlockPlayer = playerName; + _lastGlobalBlockPlayer = characterName; _lastGlobalBlockReason = "HasModelInSlotLoaded"; isDrawingChanged = true; } @@ -447,10 +447,10 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber } else { - if (!string.Equals(_lastGlobalBlockPlayer, playerName, StringComparison.Ordinal) + if (!string.Equals(_lastGlobalBlockPlayer, characterName, StringComparison.Ordinal) && !string.Equals(_lastGlobalBlockReason, "RenderFlags", StringComparison.Ordinal)) { - _lastGlobalBlockPlayer = playerName; + _lastGlobalBlockPlayer = characterName; _lastGlobalBlockReason = "RenderFlags"; isDrawingChanged = true; } @@ -459,7 +459,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber if (isDrawingChanged) { - _logger.LogTrace("Global draw block: START => {name} ({reason})", playerName, _lastGlobalBlockReason); + _logger.LogTrace("Global draw block: START => {name} ({reason})", characterName, _lastGlobalBlockReason); } IsAnythingDrawing |= isDrawing; diff --git a/MareSynchronos/Services/Mediator/MareMediator.cs b/MareSynchronos/Services/Mediator/MareMediator.cs index 3625c4b..622e2c4 100644 --- a/MareSynchronos/Services/Mediator/MareMediator.cs +++ b/MareSynchronos/Services/Mediator/MareMediator.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.Hosting; +using MareSynchronos.MareConfiguration; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System.Collections.Concurrent; using System.Reflection; @@ -14,13 +15,15 @@ public sealed class MareMediator : IHostedService private readonly CancellationTokenSource _loopCts = new(); private readonly ConcurrentQueue _messageQueue = new(); private readonly PerformanceCollectorService _performanceCollector; + private readonly MareConfigService _mareConfigService; private readonly Dictionary> _subscriberDict = []; private bool _processQueue = false; private readonly Dictionary _genericExecuteMethods = new(); - public MareMediator(ILogger logger, PerformanceCollectorService performanceCollector) + public MareMediator(ILogger logger, PerformanceCollectorService performanceCollector, MareConfigService mareConfigService) { _logger = logger; _performanceCollector = performanceCollector; + _mareConfigService = mareConfigService; } public void PrintSubscriberInfo() @@ -147,7 +150,7 @@ public sealed class MareMediator : IHostedService var msgType = message.GetType(); if (!_genericExecuteMethods.TryGetValue(msgType, out var methodInfo)) { - _genericExecuteMethods[message.GetType()] = methodInfo = GetType() + _genericExecuteMethods[msgType] = methodInfo = GetType() .GetMethod(nameof(ExecuteReflected), System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)? .MakeGenericMethod(msgType); } @@ -158,14 +161,20 @@ public sealed class MareMediator : IHostedService private void ExecuteReflected(List subscribers, T message) where T : MessageBase { - var msgTypeName = message.GetType().Name; foreach (SubscriberAction subscriber in subscribers) { try { - var isSameThread = message.KeepThreadContext ? "$" : string.Empty; - _performanceCollector.LogPerformance(this, $"{isSameThread}Execute>{msgTypeName}+{subscriber.Subscriber.GetType().Name}>{subscriber.Subscriber}", - () => ((Action)subscriber.Action).Invoke(message)); + if (_mareConfigService.Current.LogPerformance) + { + var isSameThread = message.KeepThreadContext ? "$" : string.Empty; + _performanceCollector.LogPerformance(this, $"{isSameThread}Execute>{message.GetType().Name}+{subscriber.Subscriber.GetType().Name}>{subscriber.Subscriber}", + () => ((Action)subscriber.Action).Invoke(message)); + } + else + { + ((Action)subscriber.Action).Invoke(message); + } } catch (Exception ex) { diff --git a/MareSynchronos/Services/PerformanceCollectorService.cs b/MareSynchronos/Services/PerformanceCollectorService.cs index 617c5b8..22a132d 100644 --- a/MareSynchronos/Services/PerformanceCollectorService.cs +++ b/MareSynchronos/Services/PerformanceCollectorService.cs @@ -13,7 +13,7 @@ public sealed class PerformanceCollectorService : IHostedService private const string _counterSplit = "=>"; private readonly ILogger _logger; private readonly MareConfigService _mareConfigService; - public ConcurrentDictionary>> PerformanceCounters { get; } = new(StringComparer.Ordinal); + public ConcurrentDictionary> PerformanceCounters { get; } = new(StringComparer.Ordinal); private readonly CancellationTokenSource _periodicLogPruneTask = new(); public PerformanceCollectorService(ILogger logger, MareConfigService mareConfigService) @@ -45,7 +45,7 @@ public sealed class PerformanceCollectorService : IHostedService if (TimeSpan.FromTicks(elapsed) > TimeSpan.FromMilliseconds(10)) _logger.LogWarning(">10ms spike on {counterName}: {time}", counterName, TimeSpan.FromTicks(elapsed)); #endif - list.Add(new(TimeOnly.FromDateTime(DateTime.Now), elapsed)); + list.Add((TimeOnly.FromDateTime(DateTime.Now), elapsed)); } } @@ -134,13 +134,13 @@ public sealed class PerformanceCollectorService : IHostedService if (pastEntries.Any()) { - sb.Append((" " + TimeSpan.FromTicks(pastEntries.LastOrDefault()?.Item2 ?? 0).TotalMilliseconds.ToString("0.00000", CultureInfo.InvariantCulture)).PadRight(15)); + sb.Append((" " + TimeSpan.FromTicks(pastEntries.LastOrDefault() == default ? 0 : pastEntries.Last().Item2).TotalMilliseconds.ToString("0.00000", CultureInfo.InvariantCulture)).PadRight(15)); sb.Append('|'); sb.Append((" " + TimeSpan.FromTicks(pastEntries.Max(m => m.Item2)).TotalMilliseconds.ToString("0.00000", CultureInfo.InvariantCulture)).PadRight(15)); sb.Append('|'); sb.Append((" " + TimeSpan.FromTicks((long)pastEntries.Average(m => m.Item2)).TotalMilliseconds.ToString("0.00000", CultureInfo.InvariantCulture)).PadRight(15)); sb.Append('|'); - sb.Append((" " + (pastEntries.LastOrDefault()?.Item1.ToString("HH:mm:ss.ffff", CultureInfo.InvariantCulture) ?? "-")).PadRight(15, ' ')); + sb.Append((" " + (pastEntries.LastOrDefault() == default ? "-" : pastEntries.Last().Item1.ToString("HH:mm:ss.ffff", CultureInfo.InvariantCulture))).PadRight(15, ' ')); sb.Append('|'); sb.Append((" " + pastEntries.Count).PadRight(10)); sb.Append('|');