मुझे लगता है कि यह एक पुराना धागा है, लेकिन जो @ जेसनमैकर के ऊपर दिए गए जवाब को तथ्य के रूप में स्वीकार कर रहे हैं, मुझे आश्चर्य है कि यह सही नहीं है कि हममें से कई लोग सालों से जानते हैं कि यह वास्तव में देरी को जोड़ने वाला पाइपलाइन है और ऐसा करने के लिए कुछ भी नहीं। यह आउट-नल है या नहीं। वास्तव में, यदि आप नीचे दिए गए परीक्षण चलाते हैं, तो आप जल्दी ही देखेंगे कि उसी "तेज" कास्टिंग [शून्य] और $ शून्य = के लिए, जो कि हम सभी वर्षों से सोच रहे थे कि यह तेजी से उपयोग हो रहा है, वास्तव में केवल धीमी गति से और वास्तव में बहुत कम है जब आप किसी भी पाइपलाइन को जोड़ दें। दूसरे शब्दों में, जैसे ही आप किसी चीज को पाइप करते हैं, आउट-नल का उपयोग नहीं करने का पूरा नियम कचरा में चला जाता है।
सबूत, नीचे दी गई सूची में अंतिम 3 परीक्षण। भयानक आउट-नल 32339.3792 मिलीसेकंड था, लेकिन प्रतीक्षा करें - कितनी तेजी से [शून्य] को कास्टिंग कर रहा था? 34121.9251 एमएस ?: WTF? ये मेरे सिस्टम पर असली #s हैं, VOID के लिए कास्टिंग वास्तव में धीमी थी। कैसे के बारे में = $ null? 34217.685ms ..... अभी भी friggin SLOWER! इसलिए, जैसा कि अंतिम तीन सरल परीक्षण दिखाते हैं, आउट-नल वास्तव में कई मामलों में तेजी से होता है जब पाइपलाइन पहले से उपयोग में है।
तो, यह क्यों है? सरल। यह हमेशा 100% मतिभ्रम था जो आउट-नल को पाइपिंग धीमी थी। हालांकि यह है कि कुछ भी करने के लिए PIPING धीमी है, और क्या हम पहले से ही यह नहीं जानते हैं कि बुनियादी तर्क के माध्यम से? हम सिर्फ HOW MUCH को धीमा नहीं जान सकते हैं, लेकिन ये परीक्षण निश्चित रूप से पाइपलाइन का उपयोग करने की लागत के बारे में एक कहानी बताते हैं यदि आप इससे बच सकते हैं। और, हम वास्तव में 100% गलत नहीं थे क्योंकि वास्तविक परिदृश्यों की बहुत कम संख्या है जहां आउट-नल बुराई है। कब? आउट-नल को जोड़ने पर केवल पाइप लाइन गतिविधि को जोड़ना है। दूसरे शब्दों में .... कारण $ (1.000) जैसी सरल आज्ञा | आउट-नल जैसा कि ऊपर दिखाया गया है सच दिखाया गया है।
यदि आप ऊपर दिए गए प्रत्येक परीक्षण में बस एक अतिरिक्त पाइप जोड़ते हैं, तो # मौलिक रूप से बदल जाते हैं (या बस नीचे वालों को चिपकाएँ) और जैसा कि आप स्वयं देख सकते हैं, आउट-नल वास्तव में कई मामलों में तेजी से बनता है:
$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