Skip to content

Commit 5e9b9f8

Browse files
committed
Speed up GetPoorlyCompressedExtensions by up to ~10x
1 parent 0e6e353 commit 5e9b9f8

File tree

1 file changed

+33
-22
lines changed

1 file changed

+33
-22
lines changed

CompactGUI.Core/Analyser.vb

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -59,29 +59,40 @@ Public Class Analyser
5959
End Try
6060

6161
End Sub
62-
63-
6462
Public Async Function GetPoorlyCompressedExtensions() As Task(Of List(Of ExtensionResult))
65-
Dim extClassResults As List(Of ExtensionResult) = Await Task.Run(
66-
Function()
67-
Dim extRes As New List(Of ExtensionResult)
68-
For Each fl In FileCompressionDetailsList
69-
Dim fInfo As New IO.FileInfo(fl.FileName)
70-
Dim xt = fInfo.Extension
71-
If fl.UncompressedSize = 0 Then Continue For
72-
Dim obj = extRes.FirstOrDefault(Function(x) x.extension = xt, Nothing)
73-
If obj Is Nothing Then
74-
extRes.Add(New ExtensionResult With {.extension = xt, .totalFiles = 1, .uncompressedBytes = fl.UncompressedSize, .compressedBytes = fl.CompressedSize})
75-
Continue For
76-
End If
77-
obj.uncompressedBytes += fl.UncompressedSize
78-
obj.compressedBytes += fl.CompressedSize
79-
obj.totalFiles += 1
80-
Next
81-
Return extRes
82-
End Function)
83-
84-
Return extClassResults.Where(Function(f) f.cRatio > 0.95).ToList()
63+
Dim extClassResults As New List(Of ExtensionResult)
64+
Await Task.Run(
65+
Sub()
66+
Dim extRes As New Concurrent.ConcurrentDictionary(Of String, ExtensionResult)
67+
Parallel.ForEach(FileCompressionDetailsList,
68+
Sub(fl)
69+
Dim xt = New IO.FileInfo(fl.FileName).Extension
70+
If fl.UncompressedSize = 0 Then Return
71+
72+
extRes.AddOrUpdate(xt,
73+
Function(addKey) ' Add value factory
74+
Return New ExtensionResult With {
75+
.extension = xt,
76+
.totalFiles = 1,
77+
.uncompressedBytes = fl.UncompressedSize,
78+
.compressedBytes = fl.CompressedSize
79+
}
80+
End Function,
81+
Function(updateKey, oldValue) ' Update value factory
82+
Return New ExtensionResult With {
83+
.extension = xt,
84+
.totalFiles = oldValue.totalFiles + 1,
85+
.uncompressedBytes = oldValue.uncompressedBytes + fl.UncompressedSize,
86+
.compressedBytes = oldValue.compressedBytes + fl.CompressedSize
87+
}
88+
End Function)
89+
End Sub)
90+
91+
' Filter and convert to list after aggregation
92+
extClassResults = extRes.Values.Where(Function(f) f.cRatio > 0.95).ToList()
93+
End Sub)
94+
95+
Return extClassResults
8596
End Function
8697

8798
Private Function DetectCompression(fInfo As FileInfo) As CompressionAlgorithm

0 commit comments

Comments
 (0)