Производительность перечисления файлов между .net core и powershell

#c# #powershell #.net-core

#c# #powershell #.net-core

Вопрос:

В настоящее время мне нужно просканировать папку в приложении c # на наличие файлов, соответствующих шаблону, такому как RecordID * .* В настоящее время в папке содержится несколько сотен тысяч файлов, и мы не можем это изменить, по крайней мере, на данный момент.

Выполнение этого:

             var folderPath = @"\serverfolder";
            var options = new EnumerationOptions()
            {
                BufferSize = 64000,
                RecurseSubdirectories = false,
                MatchType = MatchType.Simple,
                MatchCasing =  MatchCasing.CaseInsensitive
            };
            var searchPattern = $"{request.RecordId}*.*";
            var isMediaFileInFolder = _fileSystem.Directory
                .EnumerateFiles(folderPath, searchPattern, options);
 

Возврат списка найденных файлов займет около 10 минут.

Однако мы можем запустить это в PowerShell ISE, и оно выполняется менее чем за секунду.

 $Directory = "\serverfolder"
$Filter = "REC1234*.*"
Get-ChildItem -Path $Directory -Filter $Filter
 

Я попытался запустить powershell в c # с помощью чего-то вроде этого:

 public static List<string> PSFiles(string path, string pattern)
{
    try
    {
        ICollection<PSObject> collection = null;
        List<string> returnStrings = new List<string>();
        script = "Get-ChildItem -Path "   path   " -Filter"   pattern;
        using (PowerShell powerShell = PowerShell.Create())
        {
            powerShell.AddScript(script);
            collection = powerShell.Invoke();
        }
        foreach (PSObject obj in collection)
        {
            if (!String.IsNullOrEmpty(obj.ToString()))
            {
                foreach(var i in Regex.Split(obj.ImmediateBaseObject.ToString().Trim(), "rn"))
                {
                    returnStrings.Add(i.Trim());
                }
            }
        }
        return returnStrings;
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        throw;
    }
}
 

И для запуска потребовалось больше времени, чем попытка перечисления файлов, при этом почти все время было потрачено на PowerShell.Invoice(); шаг.

После тестирования в Powershell Core это также занимает более 10 минут. Далее, используя каталог.EnumerateFiles() в .NET заняла менее секунды.

Итак, вопрос в том, есть ли способ отразить производительность перечисления файлов внутри.NET при запуске на .NET Core?

Комментарии:

1. Powershell работает на .NET, а Powershell Core — на .NET Core. Если вы хотите сравнить производительность с .NET Core, попробуйте выполнить эту команду в Powershell Core. Также попробуйте без указания каких-либо параметров. По умолчанию подкаталоги не повторяются

2. Попробуйте повторить тесты несколько раз, в другом порядке. Я подозреваю, что вторая попытка всегда выполняется быстрее, потому что первая заставила ОС кэшировать содержимое папки

3. @PanagiotisKanavos спасибо. Я не знал о Powershell Core. Я установил это, запустил скрипт, и он работал с той же производительностью, что и при запуске скрипта внутри объекта Powershell в c #. Так что, похоже, это несоответствие .NET Core и .NET.NET. Я несколько раз запускал оба теста и Powershell. NET занимает менее секунды по сравнению с .NET Core в течение 10 минут.

4. @DavidJacobsen Итак, вы выполнили точно такую же команду в Windows Powershell (powershell.exe ) окно, а также в Powershell Core (pwsh.exe ) окно, несколько раз, и Powershell Core было последовательно медленнее?

5. @ChadBaldwin правильно. Я также создал приложение .NET, используя Directory . Перечислите файлы, и для возврата списка файлов потребовалось меньше секунды. Похоже, это разница в том, как выполняется перечисление файлов между .Net Core и .Net