পাওয়ারশেলের আউটপুট উপেক্ষা করার আরও ভাল (ক্লিনার) উপায় কী? [বন্ধ]


134

ধরা যাক আপনার কাছে এমন একটি পদ্ধতি বা একটি সেমিডলেট রয়েছে যা কিছু দেয় তবে আপনি এটি ব্যবহার করতে চান না এবং আপনি এটি আউটপুটও করতে চান না। আমি এই দুটি উপায় পেয়েছি:

Add-Item > $null

[void]Add-Item

Add-Item | Out-Null

তুমি কি ব্যবহার কর? ভাল / ক্লিনার পদ্ধতির কোনটি? কেন?


1
[অকার্যকর] সংস্করণটির মতো ... এখনও আমার জন্য হয়নি, তবে আমি এটি মনে রাখার চেষ্টা করব।
ম্যাসিফ

উত্তর:


181

আমি মাত্র চারটি অপশনের বিষয়ে কিছু পরীক্ষা করেছি did

Measure-Command {$(1..1000) | Out-Null}

TotalMilliseconds : 76.211

Measure-Command {[Void]$(1..1000)}

TotalMilliseconds : 0.217

Measure-Command {$(1..1000) > $null}

TotalMilliseconds : 0.2478

Measure-Command {$null = $(1..1000)}

TotalMilliseconds : 0.2122

## Control, times vary from 0.21 to 0.24
Measure-Command {$(1..1000)}

TotalMilliseconds : 0.2141

সুতরাং আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি Out-Nullওভারহেডের কারণে কিছু ব্যবহার করুন । পরবর্তী গুরুত্বপূর্ণ জিনিসটি আমার কাছে পাঠযোগ্যতা ছিল। আমি একরকম নিজেকে পুনর্নির্দেশ করা $nullএবং $nullনিজের সমান সেট করা পছন্দ করি। আমি কাস্টিং পছন্দ করতে ব্যবহার করি [Void], তবে কোডে বা নতুন ব্যবহারকারীদের জন্য ঝলক দেওয়ার সময় এটি ততটা বোধগম্য নয়।

আমি অনুমান করি যে আমি আউটপুটটিতে পুনর্নির্দেশকে পছন্দ করি $null

Do-Something > $null

সম্পাদন করা

স্টেজের মন্তব্যের পরে, আমি আউটপুট ট্র্যাশ করার ওভারহেডকে আরও ভালভাবে বিচ্ছিন্ন করার জন্য পাইপলাইনগুলির সাথে আরও কিছু পরীক্ষা করার সিদ্ধান্ত নিয়েছি।

এখানে একটি সাধারণ 1000 অবজেক্ট পাইপলাইন সহ কয়েকটি পরীক্ষা রয়েছে।

## Control Pipeline
Measure-Command {$(1..1000) | ?{$_ -is [int]}}

TotalMilliseconds : 119.3823

## Out-Null
Measure-Command {$(1..1000) | ?{$_ -is [int]} | Out-Null}

TotalMilliseconds : 190.2193

## Redirect to $null
Measure-Command {$(1..1000) | ?{$_ -is [int]} > $null}

TotalMilliseconds : 119.7923

এই ক্ষেত্রে, Out-Nullএকটি 60% ওভারহেড সম্পর্কে এবং > $nullএকটি 0.3% ওভারহেড সম্পর্কে আছে।

সংযোজন 2017-10-16: আমি মূলত প্যারামিটার Out-Nullব্যবহারের সাথে অন্য একটি বিকল্পকে উপেক্ষা করেছি -inputObject। এটি ওভারহেড ব্যবহার করে মনে হচ্ছে অদৃশ্য হয়ে যাবে, তবে বাক্য গঠনটি ভিন্ন:

Out-Null -inputObject ($(1..1000) | ?{$_ -is [int]})

এবং এখন সাধারণ 100 বস্তুর পাইপলাইন সহ কয়েকটি পরীক্ষার জন্য।

## Control Pipeline
Measure-Command {$(1..100) | ?{$_ -is [int]}}

TotalMilliseconds : 12.3566

## Out-Null
Measure-Command {$(1..100) | ?{$_ -is [int]} | Out-Null}

TotalMilliseconds : 19.7357

## Redirect to $null
Measure-Command {$(1..1000) | ?{$_ -is [int]} > $null}

TotalMilliseconds : 12.8527

এখানে আবার Out-Nullপ্রায় 60% ওভারহেড রয়েছে। যদিও > $nullপ্রায় 4% এর ওভারহেড রয়েছে। পরীক্ষাগুলি থেকে পরীক্ষার জন্য এখানে নম্বরগুলি কিছুটা ভিন্ন ছিল (আমি প্রায় ৫ বার দৌড়েছি এবং মাঝের জায়গাটি বেছে নিয়েছি)। তবে আমি মনে করি এটি ব্যবহার না করার একটি স্পষ্ট কারণ দেখায় Out-Null


1
আমি সাধারণত কোনও ভাষার লাইনের অংশের জন্য ভিওআইডি ব্যবহার করি এবং যদি ইতিমধ্যে এটি কোনও দীর্ঘ দীর্ঘ পাইপলাইন হয়
ক্লুমসি

25
Out-Nullওভারহেড হতে পারে তবে .. যদি কোনও বস্তুকে Out-Null০.০7676 মিলিসেকেন্ডে পাইপ করা হয় তবে তবে এটি স্ক্রিপ্টিং ভাষার জন্য এখনও পুরোপুরি ঠিক আছে :)
স্টেজ

1
আমি এটির সাথে একটু জগাখিচুড়ি করছি, এবং আমি আউট-নাল-ইনপুটঅবজেক্ট (? (1..1000) |? {$ _ -আইস [ইনট্রি]}) ব্যবহার করে [অকার্যকর] এবং> ull নাল দিয়ে সেরা পারফরম্যান্স পেয়েছি।
tomohulk

1
ভাল কথা, এটির কোনও নজরে পড়ার মতো ওভারহেড নেই বলে মনে হয়।
জেসনমারচার

5
কিছু অর্জনের বিভিন্ন উপায়ে তুলনা করার জন্য বেঞ্চমার্ক থাকা সর্বদা ভাল, তবে এখানে অন্য যে উপসংহারটি আঁকতে পারে তা উপেক্ষা করবেন না: যদি না আপনি পারফরম্যান্সের পার্থক্যকে কয়েক হাজার বার ত্যাগ না করে থাকেন তবে পারফরম্যান্সের পার্থক্য নগণ্য l এবং যদি এখানে মিলিসেকেন্ড বা সেখানে সত্যিই আপনার পক্ষে গুরুত্বপূর্ণ হয়ে থাকে, আপনি সম্ভবত পাওয়ারশেলটি প্রথম স্থানে ব্যবহার করবেন না। এই ক্ষেত্রে বিকল্পগুলি কীভাবে র‌্যাঙ্ক করে সে সম্পর্কে কোনও রায় না দিয়ে, পঠনযোগ্যতা এবং প্রোগ্রামারের অভিপ্রায় প্রকাশের মতো অন্যান্য গুণাবলীর জন্য গতি ত্যাগ করা অগত্যা খারাপ জিনিস নয়।
বেকন

22

আমি বুঝতে পেরেছি এটি একটি পুরানো থ্রেড, তবে যারা জেসনমারচারের গ্রহণযোগ্য উত্তরকে উপরে হিসাবে গ্রহণ করেছেন তাদের জন্য আমি অবাক হয়েছি যে আমরা অনেকেই বছরের পর বছর ধরে জানি এটি সংশোধন করা হয়নি এটি আসলে পাইপলাইন দেরি যুক্ত করেছে এবং কিছুই করার দরকার নেই এটা আউট-নাল বা না। প্রকৃতপক্ষে, আপনি নীচের পরীক্ষাগুলি চালিয়ে গেলে আপনি দ্রুত দেখতে পাবেন যে একই "দ্রুত" কাস্টিং [শূন্য] এবং $ শূন্য = যা আমরা বছরের পর বছর ধরে ভাবছিলাম যে এটি দ্রুত ছিল, আসলে স্লু হিসাবে আসলে এবং আসলে খুব কম আপনি যে কোনও পাইপলাইনিং যুক্ত করুন। অন্য কথায়, আপনি যে কোনও কিছুতে পাইপ করার সাথে সাথেই আউট-নাল ব্যবহার না করার পুরো নিয়মটি আবর্জনায় চলে যায়।

প্রুফ, নীচের তালিকার শেষ 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

এই গুরুত্বপূর্ণ পয়েন্টটি করার জন্য +1 আসলে, Out-Nullপাইপলাইন দিয়ে কাউকেই মোটেও ব্যবহার করতে বাধ্য করার মতো কিছুই নেই , তাই পাইপলাইনের ওভারহেড দেখানোর সর্বোত্তম উপায় হ'ল Out-Nullএটির সাথে এবং ছাড়াও। আমার সিস্টেমে, 10,000 পুনরাবৃত্তির জন্য আমি Out-Null -InputObject $GetProcess5.656 সেকেন্ডের জন্য প্রায় 0.576 সেকেন্ড (প্রায় 10x ধীর) পেতে পারি $GetProcess | Out-Null
বেকন

হাই কলিন, আপনার উত্তরের জন্য ধন্যবাদ। আমি আপনার নমুনাগুলি চালিয়েছি, তবে সমস্ত ব্যাচে [void]এবং $nullএখনও এর চেয়ে ভাল পারফর্ম করেছি | Out-Null। আমি পাই যে পাইপলাইন এবং ব-দ্বীপটি পরবর্তী ব্যাচগুলির সাথে সঙ্কুচিত হয়েছে, তবে আমার মেশিনে Out-Nullকোনও ব্যাচেই দ্রুত পারফর্ম করতে পারে না।
হিনেক

তবে অবশ্যই তাদের সাথে আমার একমত হতে হবে, যারা যুক্তি দেখান যে পারফরম্যান্সটি সব কিছু নয় এবং পাঠযোগ্যতারও কারণ হওয়া উচিত।
হিনেক

@ হেইনাক আপনার মন্তব্য পরামর্শ দেয় আপনি কলিন কী বলছিলেন তার বিন্দুটি মিস করেছেন। হ্যাঁ, [void]এবং এর থেকে $nullআরও ভাল অভিনয় করবে | Out-Null- কারণ |Out-Null -InputObject (expression)তুলনার জন্য চেষ্টা করুন ।
জোনাথন গিলবার্ট

19

রয়েছে Out-Null, cmdlet, যা আপনি একটি পাইপলাইন ব্যবহার করতে পারেন, উদাহরণস্বরূপ Add-Item | Out-Null

আউট-নুলের জন্য ম্যানুয়াল পৃষ্ঠা

NAME
    Out-Null

SYNOPSIS
    Deletes output instead of sending it to the console.


SYNTAX
    Out-Null [-inputObject <psobject>] [<CommonParameters>]


DETAILED DESCRIPTION
    The Out-Null cmdlet sends output to NULL, in effect, deleting it.


RELATED LINKS
    Out-Printer
    Out-Host
    Out-File
    Out-String
    Out-Default

REMARKS
     For more information, type: "get-help Out-Null -detailed".
     For technical information, type: "get-help Out-Null -full".

জেসনের উত্তরে সামান্য বেঞ্চমার্ক পরীক্ষার ফলাফল সম্পর্কে আপনি কী ভাবেন?
হিনেক

খুব আকর্ষণীয়, বিশেষত আউট-নুল এবং অন্যান্য পদ্ধতির মধ্যে সত্যই বিশাল পার্থক্য। আমি মনে করি [void]আউট-নুল সমাধান আরও "পাওয়ারশেলিশ" দেখায় আমি স্যুইচ করব ।
ওকাসো প্রোটাল

আমি এখনও নিশ্চিত নই, আমার পছন্দের উপায় কী। এমনকি স্টেজ ইতিমধ্যে মন্তব্য করা হিসাবে এই বিশাল পার্থক্য খুব কমই গুরুত্বপূর্ণ বলে মনে হচ্ছে।
হিনেক

2
@ হিনেক [void]খুব পরিষ্কার দেখাচ্ছে (আমি যেমন বলেছিলাম শক্তিহীন নয়), আপনি লাইনের শুরুতে দেখতে পাবেন যে এই লাইনে কোনও আউটপুট নেই। সুতরাং এটি আরেকটি সুবিধা, এবং যদি আপনি বড় লুপে আউট-নুল করেন, পারফরম্যান্স একটি সমস্যা হতে পারে;)
ওকাসো প্রোটাল

11

আমি এই জাতীয় কিছু ব্যবহার বিবেচনা করব:

function GetList
{
  . {
     $a = new-object Collections.ArrayList
     $a.Add(5)
     $a.Add('next 5')
  } | Out-Null
  $a
}
$x = GetList

থেকে আউটপুট $a.Addফেরানো হয় না - যা সমস্ত $a.Addপদ্ধতি কলগুলির জন্য ধারণ করে। অন্যথায় [void]প্রতিটি কল করার আগে আপনাকে প্রিপেন্ড করতে হবে ।

সাধারণ ক্ষেত্রে আমি সাথে যেতে পারি [void]$a.Addকারণ এটি সম্পূর্ণ স্পষ্ট যে আউটপুট ব্যবহার করা হবে না এবং বাতিল করা হবে।


2

ব্যক্তিগতভাবে, আমি ব্যবহার ... | Out-Null, কারণ অন্যদের মন্তব্য করেছেন, আরো "PowerShellish" পদ্ধতির মতো সৌন্দর্য তুলনায় ... > $nullএবং [void] ...$null = ...একটি নির্দিষ্ট স্বয়ংক্রিয় ভেরিয়েবল ব্যবহার করছে এবং এটি উপেক্ষা করা সহজ হতে পারে, অন্য পদ্ধতির অতিরিক্ত বাক্য গঠন সহ এটি স্পষ্ট করে তোলে যা আপনি কোনও অভিব্যক্তির আউটপুট বাতিল করার ইচ্ছে করে। কারণ ... | Out-Nullএবং ... > $nullমত প্রকাশের শেষে এসেছি বলে আমি মনে করি তারা কার্যকরভাবে যোগাযোগ করে "আমরা এই মুহুর্তে সমস্ত কিছু নিয়ে এসে ফেলে দিয়েছি", এবং আপনি ডিবাগিংয়ের উদ্দেশ্যে (যেমন ... # | Out-Null) তুলনামূলক তুলনায় $null =বা তার [void] আগে তুলনা করে তাদের সহজেই মন্তব্য করতে পারেন you এটি কার্যকর করার পরে কী ঘটে তা নির্ধারণ করার জন্য অভিব্যক্তি ।

আসুন, যদিও একটি পৃথক মানদণ্ডটি দেখুন: প্রতিটি বিকল্প কার্যকর করতে যে পরিমাণ সময় লাগে তা নয়, প্রতিটি বিকল্প কী করে তা নির্ধারণ করতে যে পরিমাণ সময় লাগে তা নয় । এমন সহকর্মীদের সাথে পরিবেশে কাজ করে যারা পাওয়ারশেলের সাথে অভিজ্ঞতা লাভ করেনি বা এমনকি স্ক্রিপ্টিং মোটেও হয়নি, আমার স্ক্রিপ্টগুলি এমনভাবে লেখার চেষ্টা করার প্রবণতা রয়েছে যাতে কয়েক বছর পরে কেউ আসতে পারে যা তারা খুঁজছেন এমন ভাষাও বুঝতে পারে না তারা এটির সমর্থন বা প্রতিস্থাপনের অবস্থানে থাকতে পারে বলে এটি কী করছে তা নির্ধারণের লড়াইয়ের সুযোগ। এখন অবধি অন্যদের উপর একটি পদ্ধতি ব্যবহার করার কারণ হিসাবে এটি আমার কাছে কখনও ঘটেনি, তবে কল্পনা করুন যে আপনি সেই অবস্থানে রয়েছেন এবং আপনি helpকমান্ড বা আপনার পছন্দসই সার্চ ইঞ্জিনটি কী তা অনুসন্ধান করার জন্য ব্যবহার করেনOut-Nullআছে। আপনি অবিলম্বে একটি দরকারী ফলাফল পেতে, ডান? এখন [void]এবং সঙ্গে একই কাজ করার চেষ্টা করুন $null =। এত সহজ না, তাই না?

মঞ্জুর, কোনও স্ক্রিপ্টের সামগ্রিক যুক্তি বোঝার তুলনায় একটি মানের আউটপুট দমন করা একটি খুব ছোটখাটো বিশদ এবং আপনি একটি কোডের জন্য ভাল কোড লেখার দক্ষতার ট্রেড করার আগে আপনার কোডটি এতটাই "বোবা" করার চেষ্টা করতে পারেন অবিজ্ঞানের পড়ার ক্ষমতা ... খুব ভাল কোড নয়। আমার পয়েন্ট হল, এটা যে কিছু যারা PowerShell অনর্গল সঙ্গে এমনকি পরিচিত নন সম্ভব [void], $null =ইত্যাদি এবং মাত্র কারণ সেই দ্রুততর চালানো বা টাইপ কম কীস্ট্রোকগুলি লাগতে পারে, তার মানে এই নয় তারা কি করতে সবচেয়ে ভালো উপায় করছি আপনি যা করার চেষ্টা করছেন, এবং কোনও ভাষা আপনাকে উদ্দীপনা বাক্য গঠন দেয় তার অর্থ এই নয় যে আপনি আরও পরিষ্কার এবং সুপরিচিতর পরিবর্তে এটি ব্যবহার করা উচিত। *

* আমি অনুমান করছি যে Out-Nullএটি পরিষ্কার এবং সুপরিচিত, যা আমি জানি না $true। টাইপ-টাইপ বা টাইম টু এক্সিকিউটিউট নির্বিশেষে আপনার কোডগুলির ভবিষ্যতের পাঠক এবং সম্পাদকদের কাছে আপনি যে বিকল্পটি পরিষ্কার এবং সর্বাধিক অ্যাক্সেসযোগ্য মনে করেন, সেই বিকল্পটি আমি আপনাকে ব্যবহার করার পরামর্শ দিচ্ছি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.