вторник, 9 октября 2018 г.

PoSH - эффективность команды Get-ADComputer

Предположим, нам нужно получить данные о серверах домена Active Directory при помощи команды Get-ADComputer. Как быстрее и эффективнее выполнить команду?
Приведу несколько примеров в скрипте, который измеряет время выполнения 6 различных вариантов команды.

#---START
Clear-Host
$startTime = (Get-Date)
Get-ADComputer -Filter {OperatingSystem -Like '*Server*'} | Select-Object -expand Name | Out-Null
$endTime = (Get-Date)
$ElapsedTime1 = ($endTime-$startTime).ToString('''Duration: ''mm'' min ''ss'' sec''')
Write-Host "Duration of the operation 1: $ElapsedTime1"
Write-Host ""

$startTime = (Get-Date)
Get-ADComputer -Filter * | Where-Object OperatingSystem -Like '*Server*' | Select-Object -expand Name | Out-Null
$endTime = (Get-Date)
$ElapsedTime2 = ($endTime-$startTime).ToString('''Duration: ''mm'' min ''ss'' sec''')
Write-Host "Duration of the operation 2: $ElapsedTime2"
Write-Host ""

$startTime = (Get-Date)
Get-ADComputer -Filter {OperatingSystem -Like '*Server*'} -Properties * | Select-Object -expand Name | Out-Null
$endTime = (Get-Date)
$ElapsedTime3 = ($endTime-$startTime).ToString('''Duration: ''mm'' min ''ss'' sec''')
Write-Host "Duration of the operation 3: $ElapsedTime3"
Write-Host ""

$startTime = (Get-Date)
Get-ADComputer -Filter * | Select-Object -expand Name | Out-Null
$endTime = (Get-Date)
$ElapsedTime4 = ($endTime-$startTime).ToString('''Duration: ''mm'' min ''ss'' sec''')
Write-Host "Duration of the operation 4: $ElapsedTime4"
Write-Host ""

$startTime = (Get-Date)
Get-ADComputer -Filter * -Properties * | Where-Object OperatingSystem -Like '*Server*' | Select-Object -expand Name | Out-Null
$endTime = (Get-Date)
$ElapsedTime5 = ($endTime-$startTime).ToString('''Duration: ''mm'' min ''ss'' sec''')
Write-Host "Duration of the operation 5: $ElapsedTime5"
Write-Host ""

$startTime = (Get-Date)
Get-ADComputer -Filter * -Properties * | Select-Object -expand Name | Out-Null
$endTime = (Get-Date)
$ElapsedTime6 = ($endTime-$startTime).ToString('''Duration: ''mm'' min ''ss'' sec''')
Write-Host "Duration of the operation 6: $ElapsedTime6"
Write-Host ""
#---END


Operation1 - чемпион скорости, занимает долю секунды, ведь мы сразу выбираем только серверы.
Operation2 - занимает чуть больше секунды, т.к. сначала выбираются все компьютеры домена и только позже происходит отбор серверов.
Operation3 - около 13 сек.. Хотя отбор серверов происходит вначале, как и в $SRV1 (т.е., серверов мало), но затем вместо 9 базовых у них берутся все свойства, которых больше 70.
Operation4 - время больше секунды, как и в $SRV2. В обоих случаях первоначально выбираются все компьютеры со стандартными свойствами. Различие лишь в том, что в данном случае не присходит отбор серверов (что чуть быстрее), хотя в переменную выводится больше имен (что чуть медленнее). Видимо, различия взаимно компенсируются, или же их влияние несущественно.
Operation5 - здесь сначала выбираются все компьютеры и у них берутся все свойства - это ДОЛГО -, а отбор серверов происходит на поздней стадии, что не уменьшает время. Правда, меньше времени тратится на запись в переменную (но это время минимально).
Operation6 - так же долго, как и в случае $SRV5 и это понятно: в обоих вариантах сначала выбираются все компьютеры и у них берутся все свойства. Ну, а отбор или отсутствие такового влияют незначительно.

Какие выводы можно сделать?
Во-первых, отбор (или уменьшение к-ва объектов) лучше делать в начале строки (т.е. слева), т.к. выгодно производить затратные операции над меньшим к-вом объектов.
Во-вторых, отбирайте только нужные свойства, иными словами, старайтесь как можно меньше использовать звездочку (*).
В-третьих, видно, что опрос Active Directory занимает гораздо больше времени, чем операции над объектами в памяти компьютера. Кстати, именно поэтому надо всегда стараться результат затратных операций выводить в переменные в случае необходимости повторного использования этих результатов.

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

Отправить комментарий