Mir ist klar, dass dies ein alter Thread ist, aber für diejenigen, die die oben akzeptierte Antwort von @ JasonMArcher als Tatsache betrachten, bin ich überrascht, dass sie nicht korrigiert wurde. Viele von uns wissen seit Jahren, dass es tatsächlich die PIPELINE ist, die die Verzögerung hinzufügt und NICHTS damit zu tun hat, ob es ist Out-Null oder nicht. Wenn Sie die folgenden Tests ausführen, werden Sie schnell feststellen, dass das gleiche "schnellere" Casting in [void] und $ void = das wir alle jahrelang dachten, es sei schneller, tatsächlich genauso langsam und in der Tat SEHR LANGSAM, wenn Sie fügen JEDES Pipelining hinzu. Mit anderen Worten, sobald Sie zu etwas weiterleiten, wird die gesamte Regel, out-null nicht zu verwenden, in den Papierkorb verschoben.
Beweis, die letzten 3 Tests in der Liste unten. Der schreckliche Out-Null war 32339.3792 Millisekunden, aber warte - wie viel schneller war das Casting auf [void]? 34121.9251 ms?!? WTF? Dies sind ECHTE Nummern auf meinem System. Das Casting auf VOID war tatsächlich langsamer. Wie wäre es mit = $ null? 34217.685ms ..... immer noch verdammt langsamer! Wie die letzten drei einfachen Tests zeigen, ist Out-Null in vielen Fällen SCHNELLER, wenn die Pipeline bereits verwendet wird.
Warum ist das so? Einfach. Es ist und war zu 100% eine Halluzination, dass das Piping zu Out-Null langsamer war. Es ist jedoch so, dass PIPING TO ALLES langsamer ist, und haben wir das nicht schon durch grundlegende Logik gewusst? Wir wissen vielleicht nicht, WIE VIEL langsamer, aber diese Tests erzählen sicher eine Geschichte über die Kosten der Nutzung der Pipeline, wenn Sie dies vermeiden können. Und wir haben uns nicht wirklich zu 100% geirrt, weil es eine sehr kleine Anzahl von wahren Szenarien gibt, in denen Out-Null böse ist. Wann? Beim Hinzufügen von Out-Null wird die EINZIGE Pipeline-Aktivität hinzugefügt. Mit anderen Worten ... der Grund für einen einfachen Befehl wie $ (1..1000) | Out-Null wie oben gezeigt zeigte wahr.
Wenn Sie Out-String einfach zu jedem Test oben eine zusätzliche Pipe hinzufügen, ändern sich die # radikal (oder fügen Sie einfach die folgenden ein), und wie Sie selbst sehen können, wird der Out-Null in vielen Fällen SCHNELLER:
$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