From ce9740b6d506f6f303b615de48c6693d633073fc Mon Sep 17 00:00:00 2001 From: Saravanan Ganapathi Date: Fri, 26 Sep 2025 12:18:53 +0530 Subject: [PATCH] Code Quality: Optimize large folder enumeration performance --- .../Enumerators/UniversalStorageEnumerator.cs | 14 +++++++++----- .../Storage/Enumerators/Win32StorageEnumerator.cs | 8 ++++++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/Files.App/Utils/Storage/Enumerators/UniversalStorageEnumerator.cs b/src/Files.App/Utils/Storage/Enumerators/UniversalStorageEnumerator.cs index 4bbb4592f9c0..67f38bfe6317 100644 --- a/src/Files.App/Utils/Storage/Enumerators/UniversalStorageEnumerator.cs +++ b/src/Files.App/Utils/Storage/Enumerators/UniversalStorageEnumerator.cs @@ -19,10 +19,11 @@ public static async Task> ListEntries( Func, Task> intermediateAction, Dictionary defaultIconPairs = null) { - var sampler = new IntervalSampler(500); + var sampler = new IntervalSampler(5000); var tempList = new List(); uint count = 0; var firstRound = true; + var disableIntermediateUpdates = false; IUserSettingsService userSettingsService = Ioc.Default.GetRequiredService(); @@ -30,16 +31,16 @@ public static async Task> ListEntries( { IReadOnlyList items; - uint maxItemsToRetrieve = 300; + uint maxItemsToRetrieve = 5000; if (intermediateAction is null) { // without intermediate action increase batches significantly - maxItemsToRetrieve = 1000; + maxItemsToRetrieve = 10000; } else if (firstRound) { - maxItemsToRetrieve = 32; + maxItemsToRetrieve = 1000; firstRound = false; } @@ -116,7 +117,10 @@ ex is FileNotFoundException || if (countLimit > -1 && count >= countLimit) break; - if (intermediateAction is not null && (items.Count == maxItemsToRetrieve || sampler.CheckNow())) + if (count > 50000 && !disableIntermediateUpdates) + disableIntermediateUpdates = true; + + if (intermediateAction is not null && !disableIntermediateUpdates && (items.Count == maxItemsToRetrieve || sampler.CheckNow())) { await intermediateAction(tempList); diff --git a/src/Files.App/Utils/Storage/Enumerators/Win32StorageEnumerator.cs b/src/Files.App/Utils/Storage/Enumerators/Win32StorageEnumerator.cs index bd86be9c4d3a..45ae98c30abc 100644 --- a/src/Files.App/Utils/Storage/Enumerators/Win32StorageEnumerator.cs +++ b/src/Files.App/Utils/Storage/Enumerators/Win32StorageEnumerator.cs @@ -25,9 +25,10 @@ public static async Task> ListEntries( Func, Task> intermediateAction ) { - var sampler = new IntervalSampler(500); + var sampler = new IntervalSampler(5000); var tempList = new List(); var count = 0; + var disableIntermediateUpdates = false; IUserSettingsService userSettingsService = Ioc.Default.GetRequiredService(); bool CalculateFolderSizes = userSettingsService.FoldersSettingsService.CalculateFolderSizes; @@ -89,7 +90,10 @@ Func, Task> intermediateAction if (cancellationToken.IsCancellationRequested || count == countLimit) break; - if (intermediateAction is not null && (count == 32 || sampler.CheckNow())) + if (count > 50000 && !disableIntermediateUpdates) + disableIntermediateUpdates = true; + + if (intermediateAction is not null && !disableIntermediateUpdates && (count % 10000 == 0 || sampler.CheckNow())) { await intermediateAction(tempList);