Bunun eski bir iş parçacığı olduğunu anlıyorum, ancak @ JasonMArcher'ın yukarıdaki yanıtı kabul ettiği gerçeği için, birçoğumuzun yıllardır bildiği için düzeltilmediğine şaşırdım, aslında PIPELINE gecikme ekliyor ve Out-Null ya da değil. Aslında, aşağıdaki testleri çalıştırırsanız, aynı "daha hızlı" dökümün [void] ve $ void = olduğunu hepimiz daha hızlı düşünmeyi kullandığımızı göreceksiniz, aslında SADECE YAVAŞ ve aslında ÇOK YAVAŞ HERHANGİ BİR boru hattını eklersiniz. Başka bir deyişle, herhangi bir şeye yönelir inmez, null kullanmamanın tüm kuralı çöpe gider.
İspat, aşağıdaki listede son 3 test. Korkunç Out-null 32339.3792 milisaniyeydi, ama bekleyin - [void] 'e ne kadar hızlı döküm yapıyordunuz? 34121.9251 ms?!? O NE LAN? Bunlar sistemimdeki GERÇEK # ler, VOID'ye yayın yapmak aslında YAVAŞ. = $ Null ne dersin? 34217.685ms ..... hala çok zayıf! Bu nedenle, son üç basit testin gösterdiği gibi, Out-Null aslında boru hattının zaten kullanımda olduğu durumlarda HIZLI.
Peki, neden böyle? Basit. Out-Null'a giden boruların daha yavaş olduğu her zaman% 100 halüsinasyon olmuştur. Ancak, HER ŞEYE BORULMAK daha yavaştır ve bunu temel mantık yoluyla zaten bilmiyor muyduk? NE KADAR daha yavaş olduğunu bilmiyor olabiliriz, ancak bu testler, boru hattını kullanma olasılığından kaçınmanın maliyeti hakkında bir hikaye anlatacaktır. Ve biz gerçekten% 100 yanlış değildik çünkü dışarıda kötü olan çok küçük KÜÇÜK gerçek senaryo var. Ne zaman? Out-Null eklenirken SADECE boru hattı etkinliği eklenir. Başka bir deyişle .... $ (1..1000) gibi basit bir komutun nedeni | Yukarıda gösterilen Null dışı doğru gösterdi.
Yukarıdaki her teste Out-String'e basitçe ek bir boru eklerseniz #s kökten değişir (veya sadece aşağıdakileri yapıştırın) ve kendiniz de görebileceğiniz gibi, Out-Null aslında birçok durumda DAHA HIZLI olur:
$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