Skip to content

Commit 7f5bd48

Browse files
committed
Refactor GetPoorlyCompressedExtensions method to use LINQ/PLINQ - faster
1 parent ec946bd commit 7f5bd48

File tree

2 files changed

+20
-40
lines changed

2 files changed

+20
-40
lines changed

CompactGUI.Core/Analyser.cs

Lines changed: 19 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public Analyser(string folder)
4747
Debug.WriteLine(ex.Message);
4848
return null;
4949
}
50-
50+
5151

5252

5353
}
@@ -74,48 +74,28 @@ public Analyser(string folder)
7474
}
7575

7676

77-
public async Task<List<ExtensionResult>> GetPoorlyCompressedExtensions()
77+
public List<ExtensionResult> GetPoorlyCompressedExtensions()
7878
{
79-
80-
var extRes = new ConcurrentDictionary<string, ExtensionResult>();
81-
82-
await Task.Run(() =>
83-
{
84-
Parallel.ForEach(
85-
FileCompressionDetailsList, fl =>
86-
{
87-
if (fl.UncompressedSize == 0) return;
88-
89-
string ext = Path.GetExtension(fl.FileName); //should probably use ToLowerInvariant() here
90-
91-
extRes.AddOrUpdate(
92-
ext,
93-
key => new ExtensionResult
94-
{
95-
Extension = ext,
96-
TotalFiles = 1,
97-
CompressedBytes = fl.CompressedSize,
98-
UncompressedBytes = fl.UncompressedSize
99-
},
100-
(key, existing) => new ExtensionResult
101-
{
102-
Extension = ext,
103-
TotalFiles = existing.TotalFiles + 1,
104-
CompressedBytes = existing.CompressedBytes + fl.CompressedSize,
105-
UncompressedBytes = existing.UncompressedBytes + fl.UncompressedSize
106-
});
107-
});
108-
});
109-
110-
return extRes.Values.Where(r => r.CRatio > 0.95).ToList();
111-
79+
// Only use PLINQ if the list is large enough to benefit from parallel processing
80+
IEnumerable<AnalysedFileDetails> query = FileCompressionDetailsList.Count <= 10000
81+
? FileCompressionDetailsList
82+
: FileCompressionDetailsList.AsParallel();
83+
84+
return query
85+
.Where(fl => fl.UncompressedSize > 0)
86+
.GroupBy(fl => Path.GetExtension(fl.FileName), StringComparer.OrdinalIgnoreCase)
87+
.Select(g => new ExtensionResult
88+
{
89+
Extension = g.Key,
90+
TotalFiles = g.Count(),
91+
CompressedBytes = g.Sum(fl => fl.CompressedSize),
92+
UncompressedBytes = g.Sum(fl => fl.UncompressedSize)
93+
})
94+
.Where(r => r.CRatio > 0.95)
95+
.ToList();
11296

11397
}
11498

115-
116-
117-
118-
11999
}
120100

121101

CompactGUI/Models/NewModels/ICompressableFolder.vb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ Public MustInherit Class CompressableFolder : Inherits ObservableObject
145145
If containsCompressedFiles OrElse IsFreshlyCompressed Then : FolderActionState = ActionState.Results
146146
Else : FolderActionState = ActionState.Idle
147147
End If
148-
PoorlyCompressedFiles = Await Analyser.GetPoorlyCompressedExtensions()
148+
PoorlyCompressedFiles = Analyser.GetPoorlyCompressedExtensions()
149149

150150
Return 0
151151

0 commit comments

Comments
 (0)