Первый запуск скрипта медленнее - PullRequest
0 голосов
/ 19 января 2019

Я занимаюсь профилированием производительности и заметил кое-что очень странное.Я хотел сравнить два способа составления списка файлов XML.Один использует Get-ChildItem дважды, причем первый фильтрует один файл, а второй - по имени файла, а второй подход использует Get-Item для одного файла и снова Get-ChildItem для нескольких файлов.Я завернул оба в Measure-Command.

Когда я запускаю его, первый запуск показывает намного более длительное время для самого первого Measure-Command, но не имеет значения, какой подход является первым.И это только первый за достаточно много времени.Итак, если мы назовем два подхода GIGC (Get-Item & Get-ChildItem) и GCGC (Get-ChildItem & Get-ChildItem), если у меня есть заказ GIGC, то GCGC, и я запусту его, я увижу 2,5 секунды для GIGCи 1,5 секунды для GCGC.Если я немедленно перезапущу его, они будут примерно через 1,5 секунды.Это будет оставаться около 1,5 секунд, как я перезапущу снова и снова.оставьте консоль на несколько минут, и GIGC снова будет около 2,5 секунд.НО, если я переверну его, GCGC первый и GIGC второй, цифры останутся прежними.Это первое Measure-Command, на этот раз GCGC, будет 2,5 секунды, а все остальное будет 1,5.Пусть консоль будет сидеть достаточно долго, и первая вернется обратно.

$firmAssets = '\\Mac\Support\Px Tools\Dev 4.0'

Measure-Command {
    [Collections.ArrayList]$sourceDefinitions = @(Get-Item "$firmAssets\Definitions.xml") + @(Get-ChildItem $firmAssets -Filter:Definitions_*.xml -Recurse)
}
Measure-Command {
    [Collections.ArrayList]$sourceDefinitions = @(Get-ChildItem $firmAssets -Filter:Definitions.xml) + @(Get-ChildItem $firmAssets -Filter:Definitions_*.xml -Recurse)
}

Сначала я подумал, что проблема может быть в Measure-Command, поэтому я изменил код для использования Get-Date в качестветаймер.Те же результаты.

$startTime = Get-Date
[Collections.ArrayList]$sourceDefinitions = @(Get-Item "$firmAssets\Definitions.xml") + @(Get-ChildItem $firmAssets -Filter:Definitions_*.xml -Recurse)
Write-Host "$(New-Timespan –Start:$startTime –End:(Get-Date))"

$startTime = Get-Date
[Collections.ArrayList]$sourceDefinitions = @(Get-ChildItem $firmAssets -Filter:Definitions.xml) + @(Get-ChildItem $firmAssets -Filter:Definitions_*.xml -Recurse)
Write-Host "$(New-Timespan –Start:$startTime –End:(Get-Date))"

Итак, в прошлом тесте я подумал, что это может быть что-то, связанное с консолью, поэтому я преобразовал его в скрипт.Странно, тот же результат!Первый запуск всегда существенно медленнее.Мое (необразованное) предположение состоит в том, что происходит некоторая инициализация памяти, которая происходит при первом запуске и затем остается инициализированной при многократном использовании PowerShell, будь то сценарии или консоль.По сути, это что-то вроде PowerShell, которое кажется нам чем-то, что мы не можем обойти.Но, надеюсь, у кого-то есть лучший ответ, чем у меня: «Вот так работает PowerShell, прекратите это»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...