From a651720d08705c0d0c0e5078814fd7c54a5d5736 Mon Sep 17 00:00:00 2001 From: Katter Date: Sat, 24 Aug 2024 21:28:36 +0500 Subject: [PATCH] Optimize (?) ScreenshotsLibrary.ClearExceed --- SightKeeper.Domain/Extensions.cs | 27 +++++++++++++++++++ .../Screenshots/ScreenshotsLibrary.cs | 21 ++++++++++----- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/SightKeeper.Domain/Extensions.cs b/SightKeeper.Domain/Extensions.cs index fadb61d8..0dca8648 100644 --- a/SightKeeper.Domain/Extensions.cs +++ b/SightKeeper.Domain/Extensions.cs @@ -17,4 +17,31 @@ public static ImmutableHashSet ToImmutableHashSetThrowOnDuplicate(this IEn Guard.IsTrue(enumerable.All(tagsBuilder.Add)); return tagsBuilder.ToImmutable(); } + + public static IEnumerable<(ImmutableArray, int start, int end)> ToRanges(this IEnumerable enumerable, Func indexSelector) + { + using var enumerator = enumerable.GetEnumerator(); + if (!enumerator.MoveNext()) + yield break; + var initialItem = enumerator.Current; + int previousIndex = indexSelector(initialItem); + int currentRangeStart = previousIndex; + var itemsBuilder = ImmutableArray.CreateBuilder(); + itemsBuilder.Add(initialItem); + while (enumerator.MoveNext()) + { + var item = enumerator.Current; + var index = indexSelector(item); + if (index != previousIndex + 1) + { + yield return (itemsBuilder.DrainToImmutable(), currentRangeStart, previousIndex); + currentRangeStart = index; + } + itemsBuilder.Add(item); + previousIndex = index; + } + + if (itemsBuilder.Count != 0) + yield return (itemsBuilder.ToImmutable(), currentRangeStart, previousIndex); + } } \ No newline at end of file diff --git a/SightKeeper.Domain/Model/DataSets/Screenshots/ScreenshotsLibrary.cs b/SightKeeper.Domain/Model/DataSets/Screenshots/ScreenshotsLibrary.cs index 961903ae..a7d3e435 100644 --- a/SightKeeper.Domain/Model/DataSets/Screenshots/ScreenshotsLibrary.cs +++ b/SightKeeper.Domain/Model/DataSets/Screenshots/ScreenshotsLibrary.cs @@ -41,7 +41,8 @@ public ScreenshotsLibrary(DataSet dataSet) public override Screenshot CreateScreenshot(DateTime creationDate, out ImmutableArray removedScreenshots) { Screenshot screenshot = new(this, creationDate); - Guard.IsTrue(_screenshots.Add(screenshot)); + Guard.IsGreaterThan(creationDate, _screenshots[^1].CreationDate); + _screenshots.Add(screenshot); removedScreenshots = ClearExceed(); return screenshot; } @@ -60,14 +61,22 @@ private ImmutableArray ClearExceed() if (exceedAmount <= 0) return ImmutableArray.Empty; var builder = ImmutableArray.CreateBuilder(exceedAmount); - var screenshotsToDelete = _screenshots.Where(screenshot => screenshot.Asset == null).Take(exceedAmount); - foreach (var screenshot in screenshotsToDelete) + var screenshotsToDelete = + _screenshots + .Select((screenshot, index) => (screenshot, index)) + .Where(tuple => tuple.screenshot.Asset == null) + .Take(exceedAmount) + .ToRanges(tuple => tuple.index) + .OrderByDescending(tuple => tuple.start); + foreach (var (tuples, start, end) in screenshotsToDelete) { - Guard.IsTrue(_screenshots.Remove(screenshot)); - builder.Add(screenshot); + _screenshots.RemoveRange(start, end); + builder.Capacity += tuples.Length; + foreach (var (screenshot, _) in tuples) + builder.Add(screenshot); } return builder.ToImmutable(); } - private readonly SortedSet> _screenshots = new(ScreenshotsDateComparer.Instance); + private readonly List> _screenshots = new(); } \ No newline at end of file