Skip to content

Commit 7524ae5

Browse files
committed
Optimise Compactor's BuildWorkingFilesList method
- improved speed and reduced allocations particularly when there is a huge skiplist to iterate over
1 parent 4edbcdf commit 7524ae5

1 file changed

Lines changed: 15 additions & 17 deletions

File tree

CompactGUI.Core/Compactor.cs

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class Compactor : ICompressor, IDisposable
1212
{
1313

1414
private readonly string workingDirectory;
15-
private readonly string[] excludedFileExtensions;
15+
private readonly HashSet<string> excludedFileExtensions;
1616
private readonly WOFCompressionAlgorithm wofCompressionAlgorithm;
1717

1818

@@ -27,7 +27,7 @@ public class Compactor : ICompressor, IDisposable
2727
public Compactor(string folderPath, WOFCompressionAlgorithm compressionLevel, string[] excludedFileTypes)
2828
{
2929
workingDirectory = folderPath;
30-
excludedFileExtensions = excludedFileTypes;
30+
excludedFileExtensions = new HashSet<string>(excludedFileTypes);
3131
wofCompressionAlgorithm = compressionLevel;
3232

3333
InitializeCompressionInfoPointer();
@@ -99,30 +99,28 @@ private async Task PauseAndProcessFile(FileDetails file, long totalFilesSize, Ca
9999
}
100100
}
101101

102-
private async Task<IEnumerable<FileDetails>> BuildWorkingFilesList()
102+
public async Task<IEnumerable<FileDetails>> BuildWorkingFilesList()
103103
{
104104
uint clusterSize = SharedMethods.GetClusterSize(workingDirectory);
105105

106-
var filesList = new ConcurrentBag<FileDetails>();
107-
108106
var analyser = new Analyser(workingDirectory);
109107
var ret = await analyser.AnalyseFolder(cancellationTokenSource.Token);
110108

111-
Parallel.ForEach(analyser.FileCompressionDetailsList, (fl) =>
112-
{
113-
var ft = fl.FileInfo;
114-
if ((!excludedFileExtensions.Contains(ft?.Extension) || excludedFileExtensions.Contains(fl.FileName))
115-
&& ft.Length > clusterSize
116-
&& fl.CompressionMode != wofCompressionAlgorithm)
117-
{
118-
filesList.Add(new FileDetails { FileName = fl.FileName, UncompressedSize = fl.UncompressedSize });
119-
}
120-
});
109+
var filesList = analyser.FileCompressionDetailsList
110+
.Where(fl =>
111+
fl.CompressionMode != wofCompressionAlgorithm
112+
&& fl.UncompressedSize > clusterSize
113+
&& ((fl.FileInfo != null && !excludedFileExtensions.Contains(fl.FileInfo.Extension)) || excludedFileExtensions.Contains(fl.FileName))
114+
)
115+
.Select(fl => new FileDetails(fl.FileName, fl.UncompressedSize))
116+
.ToList();
121117

122-
return filesList.ToList();
118+
return filesList;
123119
}
124120

125121

122+
123+
126124
public void Pause()
127125
{
128126
pauseSemaphore.Wait(cancellationTokenSource.Token);
@@ -154,7 +152,7 @@ public void Dispose()
154152
}
155153

156154

157-
private readonly record struct FileDetails(string FileName, long UncompressedSize);
155+
public readonly record struct FileDetails(string FileName, long UncompressedSize);
158156

159157

160158
}

0 commit comments

Comments
 (0)