Zdaję sobie sprawę, że jest to stary wątek, ale dla tych, którzy przyjmują powyższą odpowiedź @ JasonMArchera za fakt, jestem zaskoczony, że nie została poprawiona, wielu z nas wiedziało od lat, że jest to tak naprawdę PIPELINE dodający opóźnienie i NIC w jest Out-Null czy nie. W rzeczywistości, jeśli uruchomisz poniższe testy, szybko zobaczysz, że te same „szybsze” rzucanie do [void] i $ void = które przez lata myśleliśmy, że było szybsze, są właściwie TAKIE WOLNE, a tak naprawdę BARDZO WOLNE, gdy dodasz JAKIEKOLWIEK rurociągi. Innymi słowy, gdy tylko do czegokolwiek potokujesz, cała zasada nieużywania out-null trafia do kosza.
Dowód, ostatnie 3 testy z poniższej listy. Straszna wartość Out-null wynosiła 32339,3792 milisekund, ale czekaj - o ile szybsze było rzucanie do [void]? 34121,9251 ms?!? WTF? To są PRAWDZIWE # w moim systemie, przesyłanie do VOID było w rzeczywistości wolniejsze. A co powiesz na = $ null? 34217.685ms ..... nadal cholernie wolniej! Tak więc, jak pokazują ostatnie trzy proste testy, wartość Out-Null jest w rzeczywistości SZYBSZA w wielu przypadkach, gdy potok jest już używany.
Więc dlaczego tak się dzieje? Prosty. To jest i zawsze było w 100% halucynacją, że połączenie z Out-Null było wolniejsze. Chodzi jednak o to, że RUROWANIE DO WSZYSTKIEGO jest wolniejsze i czy nie wiedzieliśmy już o tym za pomocą podstawowej logiki? Po prostu możemy nie wiedzieć, JAK DUŻO wolniej, ale te testy z pewnością opowiadają historię o koszcie korzystania z potoku, jeśli można go uniknąć. I nie myliliśmy się w 100%, ponieważ istnieje bardzo MAŁA liczba prawdziwych scenariuszy, w których wartość zerowa jest zła. Kiedy? Podczas dodawania Out-Null dodaje się TYLKO działanie potoku. Innymi słowy… powodem jest proste polecenie, takie jak $ (1..1000) | Out-Null, jak pokazano powyżej, okazało się prawdą.
Jeśli po prostu dodasz dodatkową potokę do Out-String do każdego powyższego testu, #s zmieniają się radykalnie (lub po prostu wklejasz te poniżej) i, jak sam widzisz, Out-Null faktycznie staje się SZYBSZY w wielu przypadkach:
$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