আমি বুঝতে পেরেছি এটি একটি পুরানো থ্রেড, তবে যারা জেসনমারচারের গ্রহণযোগ্য উত্তরকে উপরে হিসাবে গ্রহণ করেছেন তাদের জন্য আমি অবাক হয়েছি যে আমরা অনেকেই বছরের পর বছর ধরে জানি এটি সংশোধন করা হয়নি এটি আসলে পাইপলাইন দেরি যুক্ত করেছে এবং কিছুই করার দরকার নেই এটা আউট-নাল বা না। প্রকৃতপক্ষে, আপনি নীচের পরীক্ষাগুলি চালিয়ে গেলে আপনি দ্রুত দেখতে পাবেন যে একই "দ্রুত" কাস্টিং [শূন্য] এবং $ শূন্য = যা আমরা বছরের পর বছর ধরে ভাবছিলাম যে এটি দ্রুত ছিল, আসলে স্লু হিসাবে আসলে এবং আসলে খুব কম আপনি যে কোনও পাইপলাইনিং যুক্ত করুন। অন্য কথায়, আপনি যে কোনও কিছুতে পাইপ করার সাথে সাথেই আউট-নাল ব্যবহার না করার পুরো নিয়মটি আবর্জনায় চলে যায়।
প্রুফ, নীচের তালিকার শেষ 3 টি পরীক্ষা। ভয়াবহ আউট-নালটি 32339.3792 মিলি সেকেন্ড ছিল, তবে অপেক্ষা করুন - কতটা দ্রুত [অকার্যকর] এ কাস্টিং ছিল? 34121.9251 এমএস?!?!? ডব্লিউটিএফ? এগুলি আমার সিস্টেমে রিয়েল # গুলি, ভিওআইডি-তে কাস্ট করা আসলে স্লুওয়ার ছিল। কেমন হবে = ull নাল? 34217.685ms ..... এখনও নিখরচায়! সুতরাং, শেষ তিনটি সহজ পরীক্ষার হিসাবে, পাইপলাইন ইতিমধ্যে ব্যবহৃত অবস্থায় আউট-নুল আসলে অনেক ক্ষেত্রেই ত্বরান্বিত হয়।
তো, এটা কেন? সহজ। এটি সর্বদা 100% একটি হ্যালুসিনেশন ছিল যে আউট-নুলের কাছে পাইপিং ধীর ছিল। তবে এটি যে কোনও কিছুতে পাইপিং করা ধীরতর, এবং আমরা কি ইতিমধ্যে বেসিক লজিকের মাধ্যমে জানি না? আমরা কেবল ধীরে ধীরে কতটা জানি না, তবে এই পরীক্ষাগুলি অবশ্যই যদি আপনি এড়াতে পারেন তবে পাইপলাইন ব্যবহারের ব্যয় সম্পর্কে একটি গল্প বলবেন। এবং, আমরা সত্যই 100% ভুল ছিলাম না কারণ এখানে খুব ছোট সংখ্যক সত্য পরিস্থিতি রয়েছে যেখানে অকার্যকর মন্দ। কখন? আউট-নুল যুক্ত করার সময় কেবলমাত্র পাইপলাইন ক্রিয়াকলাপ যোগ করা হচ্ছে। অন্য কথায় .... কারণটি সাধারণ কমান্ডের মতো like (1..1000) | উপরে দেখানো হিসাবে আউট-নাল সত্য দেখিয়েছে।
যদি আপনি কেবল উপরের প্রতিটি পরীক্ষায় আউট স্ট্রিংয়ের জন্য অতিরিক্ত পাইপ যুক্ত করেন তবে # টি মূলত পরিবর্তিত হয় (বা কেবল নীচেরটিগুলি পেস্ট করুন) এবং আপনি নিজেরাই দেখতে পাচ্ছেন, আউট-নুল আসলে অনেক ক্ষেত্রেই দ্রুততর হয়ে ওঠে:
$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