Sei que esse é um tópico antigo, mas, para aqueles que consideram a resposta aceita pelo @ JasonMArcher acima como um fato, estou surpreso que isso não tenha sido corrigido. Muitos de nós sabemos há anos que é o PIPELINE que adiciona o atraso e nada a ver com a questão de saber se é Out-Null ou não. De fato, se você executar os testes abaixo, verá rapidamente que o mesmo elenco "mais rápido" para [void] e $ void = que, durante anos, todos nós pensamos que era mais rápido, na verdade são MUITO LENTO e de fato MUITO LENTO quando você adiciona QUALQUER canalização. Em outras palavras, assim que você direciona para qualquer coisa, toda a regra de não usar nulo fora entra no lixo.
Prova, os últimos 3 testes na lista abaixo. O horrível nulo Out foi 32339,3792 milissegundos, mas espere - quanto mais rápido o lançamento foi para [void]? 34121.9251 ms?!? WTF? Estes são REAIS no meu sistema, a transmissão para VOID foi mais lenta. Que tal = $ null? 34217.685ms ..... ainda friggin MAIS LENTO! Portanto, como mostram os três últimos testes simples, o Out-Null é realmente MAIS RÁPIDO em muitos casos quando o pipeline já está em uso.
Então, por que isso? Simples. É e sempre foi 100% uma alucinação que a tubulação para Out-Null fosse mais lenta. É, no entanto, que TUBAR PARA QUALQUER COISA é mais lento, e nós já não sabíamos disso através da lógica básica? Podemos simplesmente não saber QUANTO MAIS LENTO, mas esses testes certamente contam uma história sobre o custo do uso do pipeline, se você puder evitá-lo. E, na verdade, não estávamos 100% errados, porque há um número muito PEQUENO de cenários verdadeiros em que nulo externo é ruim. Quando? Ao adicionar Out-Null, adicione a atividade do pipeline ONLY. Em outras palavras ... o motivo de um comando simples como $ (1..1000) | Out-Null como mostrado acima mostrou verdadeiro.
Se você simplesmente adicionar um pipe adicional ao Out-String em todos os testes acima, os #s mudam radicalmente (ou apenas cola os abaixo) e, como você pode ver por si mesmo, o Out-Null se torna MAIS RÁPIDO em muitos casos:
$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