Я усвідомлюю, що це стара тема, але для тих, хто приймає відповідь @ JasonMArcher вище як факт, я дивуюсь, що вона не була виправлена багатьма з нас протягом багатьох років, це насправді ПІДПРИЄМКА, що додає затримку і НІЧОГО не робити з тим це Out-Null чи ні. Насправді, якщо запустити тести нижче, ви швидко побачите, що той самий "швидший" кастинг до [void] і $ void = що роками ми всі використовували, думаючи, що це швидше, насправді ДОВІДЖЕ ТАКОЖ НЕБЕЗПЕЧНО, а насправді ДУЖЕ НЕЗАЛЕЖНО, коли ви додаєте БЕЗКОШТОВНІ трубопроводи. Іншими словами, як тільки ви підкажете що-небудь, все правило не використовувати out-null переходить у смітник.
Доказ, останні 3 тести у наведеному нижче списку. Жахливий Out-null становив 32339,3792 мілісекунди, але зачекайте - наскільки швидше було кастинг до [void]? 34121.9251 мс?!? WTF? Це РЕАЛЬНІ # в моїй системі, а передача на VOID була насправді ПОЛІШЕ. Як щодо = $ null? 34217.685ms ..... все ще friggin СЛІД! Отже, як показують три останні прості тести, Out-Null насправді швидше у багатьох випадках, коли трубопровід уже використовується.
Отже, чому це? Простий. Це і завжди було 100% галюцинацією, що передача каналу Out-Null проходила повільніше. Однак, ПІДПРИЄМСТВО ДО ЧОГО-то відбувається повільніше, і хіба ми цього не знали за допомогою базової логіки? Ми просто не можемо знати, ЯК СТОЛЬКО повільніше, але ці тести точно розповідають про вартість використання трубопроводу, якщо ви зможете його уникнути. І ми насправді не помилялися на 100%, тому що існує дуже МАЛЬНА кількість справжніх сценаріїв, коли нецільовим є зло. Коли? При додаванні Out-Null додається ТІЛЬКА активність трубопроводу. Іншими словами .... причина проста команда на зразок $ (1..1000) | Як показано вище, Out-Null показав справжнє.
Якщо ви просто додаєте додаткову трубу до Out-String до кожного тесту, поданого вище, #s докорінно змінюється (або просто вставляєте наведені нижче), і як ви самі бачите, Out-Null фактично стає Швидше у багатьох випадках:
$GetProcess = Get-Process
# Batch 1 - Test 1
(Measure-Command {
for ($i = 1; $i -lt 99; $i++)
{
$GetProcess | Out-Null
}
}).TotalMilliseconds
# Batch 1 - Test 2
(Measure-Command {
for ($i = 1; $i -lt 99; $i++)
{
[void]($GetProcess)
}
}).TotalMilliseconds
# Batch 1 - Test 3
(Measure-Command {
for ($i = 1; $i -lt 99; $i++)
{
$null = $GetProcess
}
}).TotalMilliseconds
# Batch 2 - Test 1
(Measure-Command {
for ($i = 1; $i -lt 99; $i++)
{
$GetProcess | Select-Object -Property ProcessName | Out-Null
}
}).TotalMilliseconds
# Batch 2 - Test 2
(Measure-Command {
for ($i = 1; $i -lt 99; $i++)
{
[void]($GetProcess | Select-Object -Property ProcessName )
}
}).TotalMilliseconds
# Batch 2 - Test 3
(Measure-Command {
for ($i = 1; $i -lt 99; $i++)
{
$null = $GetProcess | Select-Object -Property ProcessName
}
}).TotalMilliseconds
# Batch 3 - Test 1
(Measure-Command {
for ($i = 1; $i -lt 99; $i++)
{
$GetProcess | Select-Object -Property Handles, NPM, PM, WS, VM, CPU, Id, SI, Name | Out-Null
}
}).TotalMilliseconds
# Batch 3 - Test 2
(Measure-Command {
for ($i = 1; $i -lt 99; $i++)
{
[void]($GetProcess | Select-Object -Property Handles, NPM, PM, WS, VM, CPU, Id, SI, Name )
}
}).TotalMilliseconds
# Batch 3 - Test 3
(Measure-Command {
for ($i = 1; $i -lt 99; $i++)
{
$null = $GetProcess | Select-Object -Property Handles, NPM, PM, WS, VM, CPU, Id, SI, Name
}
}).TotalMilliseconds
# Batch 4 - Test 1
(Measure-Command {
for ($i = 1; $i -lt 99; $i++)
{
$GetProcess | Out-String | Out-Null
}
}).TotalMilliseconds
# Batch 4 - Test 2
(Measure-Command {
for ($i = 1; $i -lt 99; $i++)
{
[void]($GetProcess | Out-String )
}
}).TotalMilliseconds
# Batch 4 - Test 3
(Measure-Command {
for ($i = 1; $i -lt 99; $i++)
{
$null = $GetProcess | Out-String
}
}).TotalMilliseconds