Some time ago I wrote a post about converting a WPF application into .NET Core. One thing that called my attention in this Build 2019 talk was that the performance for file enumerations was enhanced in the .NET core apps. So I decided to check this with my own app and see what happens in my machine.
I added some measuring data in the app, so I could see what happens there:
private async void StartClick(object sender, RoutedEventArgs e)
{
var fbd = new WPFFolderBrowserDialog();
if (fbd.ShowDialog() != true)
return;
FilesList.ItemsSource = null;
ExtList.ItemsSource = null;
ExtSeries.ItemsSource = null;
AbcList.ItemsSource = null;
AbcSeries.ItemsSource = null;
var selectedPath = fbd.FileName;
Int64 minSize;
if (!Int64.TryParse(MinSizeBox.Text, out minSize))
return;
List<FileInfo> files = null;
var sw = new Stopwatch();
var timeStr = "";
await Task.Factory.StartNew(() =>
{
sw.Start();
files = GetFilesInDirectory(selectedPath).ToList();
timeStr = $" {sw.ElapsedMilliseconds} for enumeration";
sw.Restart();
files = files.Where(f => f.Length >= minSize)
.OrderByDescending(f => f.Length)
.ToList();
timeStr += $" {sw.ElapsedMilliseconds} for ordering and filtering";
});
var totalSize = files.Sum(f => f.Length);
TotalFilesText.Text = $"# Files: {files.Count}";
LengthFilesText.Text = $"({totalSize:N0} bytes)";
sw.Restart();
FilesList.ItemsSource = files;
var extensions = files.GroupBy(f => f.Extension)
.Select(g => new { Extension = g.Key, Quantity = g.Count(), Size = g.Sum(f => f.Length) })
.OrderByDescending(t => t.Size).ToList();
ExtList.ItemsSource = extensions;
ExtSeries.ItemsSource = extensions;
var tmp = 0.0;
var abcData = files.Select(f =>
{
tmp += f.Length;
return new { f.Name, Percent = tmp / totalSize * 100 };
}).ToList();
AbcList.ItemsSource = abcData;
AbcSeries.ItemsSource = abcData.OrderBy(d => d.Percent).Select((d, i) => new { Item = i, d.Percent });
timeStr += $" {sw.ElapsedMilliseconds} to fill data";
TimesText.Text = timeStr;
}
That way, I could measure two things: the time to enumerate the files and the times to sort, filter and assign the files to the lists. Then, I run the two programs, to see what happened.
The machine I've run is a Virtual machine with a Core I5 and 4 virtual processors and a virtualized hard disk, with 12,230 files (93.13 GB of data). The measures may vary on your machine, but the differences should be comparable. To avoid bias, I ran 3 times each program (in Admin mode), then rebooted and run the other one.
Here are the results I've got:
| Run | Enumerate | Sort/Filter | Assign |
| --- | --- | --- | --- |
| .NET | | | |
| 1 | 137031 | 96 | 43 |
| 2 | 58828 | 56 | 9 |
| 3 | 59474 | 55 | 8 |
| Avg | 85111 | 69 | 20 |
| .NET Core | | | |
| 1 | 91105 | 120 | 32 |
| 2 | 33422 | 90 | 14 |
| 3 | 32907 | 87 | 20 |
| Avg | 52478 | 99 | 22 |
As you can see by the numbers, the .NET Core application improved a lot the times for file enumeration, but still lacks some effort for sorting/filtering and assigning data to the UI lists. But that's not bad for a platform still in preview!
If you do some testing for the performance, I'm curious to see what you've got, you can put your results and comments in the Comments section.