Tôi nhận ra đây là một chủ đề cũ, nhưng đối với những người tham gia câu trả lời được chấp nhận của @ JasonMArer'ser là sự thật, tôi ngạc nhiên rằng nó đã không được sửa chữa trong nhiều năm qua, đó thực sự là PIPELINE thêm sự chậm trễ và KHÔNG làm gì với việc liệu nó là Out-Null hay không. Trên thực tế, nếu bạn chạy các bài kiểm tra bên dưới, bạn sẽ nhanh chóng thấy rằng việc truyền "nhanh hơn" tương tự thành [void] và $ void = rằng trong nhiều năm qua, tất cả chúng ta đều nghĩ rằng nó nhanh hơn, thực sự CHỈ CÒN R SL RÀNG và thực tế RẤT RẤT bạn thêm BẤT K pip đường ống nào. Nói cách khác, ngay khi bạn chuyển sang bất cứ điều gì, toàn bộ quy tắc không sử dụng out-null sẽ đi vào thùng rác.
Bằng chứng, 3 bài kiểm tra cuối cùng trong danh sách dưới đây. Out-null khủng khiếp là 32339.3792 mili giây, nhưng chờ đã - tốc độ được truyền tới [void] nhanh hơn bao nhiêu? 34121.9251 ms?!? WTF? Đây là những # THỰC trên hệ thống của tôi, chuyển sang VOID thực sự là SLOWER. Làm thế nào về = $ null? 34217.685ms ..... vẫn còn SLOWER SLOWER! Vì vậy, như ba thử nghiệm đơn giản cuối cùng cho thấy, Out-Null thực sự NHANH CHÓNG trong nhiều trường hợp khi đường ống đã được sử dụng.
Vì vậy, tại sao điều này? Đơn giản. Đó là và luôn luôn là ảo giác 100% rằng đường ống đến Out-Null chậm hơn. Tuy nhiên, việc PIPING TO ANYINGING chậm hơn và chúng ta đã không biết điều đó thông qua logic cơ bản? Chúng tôi có thể không biết NHIỀU chậm hơn, nhưng những thử nghiệm này chắc chắn sẽ kể một câu chuyện về chi phí sử dụng đường ống nếu bạn có thể tránh được. Và, chúng tôi đã không thực sự sai 100% bởi vì có một số lượng rất nhỏ các kịch bản thực sự trong đó out-null là xấu xa. Khi nào? Khi thêm Out-Null là thêm hoạt động đường ống CHỈ. Nói cách khác .... lý do một lệnh đơn giản như $ (1..1000) | Out-Null như hình trên cho thấy sự thật.
Nếu bạn chỉ cần thêm một ống bổ sung vào Out-String cho mọi thử nghiệm ở trên, thì #s thay đổi hoàn toàn (hoặc chỉ dán những cái bên dưới) và như bạn có thể thấy, Out-Null thực sự trở thành FASTER trong nhiều trường hợp:
$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