From 2a9e42b9e646340f3734f62cfa268fb49bce9405 Mon Sep 17 00:00:00 2001 From: Steven Pelech Date: Sun, 20 Sep 2026 10:12:21 -0500 Subject: [PATCH 1/2] perf(settings): cache deserialized AppSettings in SettingsService --- LocalLLMServerManager.Tests/AppSettingsTests.cs | 10 ++++++++++ Services/SettingsService.cs | 16 ++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/LocalLLMServerManager.Tests/AppSettingsTests.cs b/LocalLLMServerManager.Tests/AppSettingsTests.cs index fe67f94..160921e 100644 --- a/LocalLLMServerManager.Tests/AppSettingsTests.cs +++ b/LocalLLMServerManager.Tests/AppSettingsTests.cs @@ -125,4 +125,14 @@ public void SettingsService_SaveAndLoad_RoundTripsSuccessfully() service.SaveSettings(original); } } + + [Fact] + public void SettingsService_UsesCachedInstance_AfterInitialLoad() + { + var service = new SettingsService(); + var firstLoad = service.LoadSettings(); + var secondLoad = service.LoadSettings(); + + Assert.Same(firstLoad, secondLoad); + } } diff --git a/Services/SettingsService.cs b/Services/SettingsService.cs index 6c03d1e..29dc2ed 100644 --- a/Services/SettingsService.cs +++ b/Services/SettingsService.cs @@ -6,6 +6,7 @@ namespace LocalLLMServerManager.Services; public class SettingsService : ISettingsService { private static readonly object SettingsLock = new(); + private AppSettings? _cachedSettings; public string SettingsFilePath() { @@ -16,6 +17,11 @@ public AppSettings LoadSettings() { lock (SettingsLock) { + if (_cachedSettings != null) + { + return _cachedSettings; + } + for (int i = 0; i < 5; i++) { try @@ -24,7 +30,8 @@ public AppSettings LoadSettings() if (File.Exists(path)) { var json = File.ReadAllText(path); - return JsonSerializer.Deserialize(json) ?? new AppSettings(); + _cachedSettings = JsonSerializer.Deserialize(json) ?? new AppSettings(); + return _cachedSettings; } break; } @@ -33,7 +40,9 @@ public AppSettings LoadSettings() Thread.Sleep(50); } } - return new AppSettings(); + + _cachedSettings = new AppSettings(); + return _cachedSettings; } } @@ -48,6 +57,9 @@ public void SaveSettings(AppSettings settings) var path = SettingsFilePath(); var json = JsonSerializer.Serialize(settings, new JsonSerializerOptions { WriteIndented = true }); File.WriteAllText(path, json); + + // Update cache after successful save + _cachedSettings = settings; break; } catch From 763a953b1230a399b413a6c90b848b1238d65eef Mon Sep 17 00:00:00 2001 From: Steven Pelech Date: Sun, 20 Sep 2026 10:15:29 -0500 Subject: [PATCH 2/2] fix(settings): use static cache field across SettingsService instances --- Services/SettingsService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/SettingsService.cs b/Services/SettingsService.cs index 29dc2ed..ace7049 100644 --- a/Services/SettingsService.cs +++ b/Services/SettingsService.cs @@ -6,7 +6,7 @@ namespace LocalLLMServerManager.Services; public class SettingsService : ISettingsService { private static readonly object SettingsLock = new(); - private AppSettings? _cachedSettings; + private static AppSettings? _cachedSettings; public string SettingsFilePath() {