পাওয়ারশেল পারফরম্যান্স পার্থক্য ফিল্টার বনাম ফাংশন


11

আমি পাওয়ারশেলের আরও কিছু অন্তর্দৃষ্টি পেতে উইন্ডোজ পাওয়ারশেল ৩.২ ধাপে ধাপে বইটি পড়ছি।

পৃষ্ঠা 201 এ লেখক দেখিয়েছেন যে কোনও ফিল্টার একই ক্রিয়ামূলকভাবে ফাংশনের চেয়ে দ্রুত।

এই স্ক্রিপ্টটি তার কম্পিউটারে 2.6 সেকেন্ড সময় নেয়:

MeasureAddOneFilter.ps1
Filter AddOne
{ 
 "add one filter"
  $_ + 1
}

Measure-Command { 1..50000 | addOne }

এবং এই এক 4.6 সেকেন্ড

MeasureAddOneFunction.ps1
Function AddOne
{  
  "Add One Function"
  While ($input.moveNext())
   {
     $input.current + 1
   }
}

Measure-Command { 1..50000 | addOne }

যদি আমি এই কোডটি চালিত করি তবে তার ফলাফলের ঠিক বিপরীতটি পাওয়া যাবে:

.\MeasureAddOneFilter.ps1
Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 226
Ticks             : 2266171
TotalDays         : 2,62288310185185E-06
TotalHours        : 6,29491944444444E-05
TotalMinutes      : 0,00377695166666667
TotalSeconds      : 0,2266171
TotalMilliseconds : 226,6171

.\MeasureAddOneFunction.ps1

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 93
Ticks             : 933649
TotalDays         : 1,08061226851852E-06
TotalHours        : 2,59346944444444E-05
TotalMinutes      : 0,00155608166666667
TotalSeconds      : 0,0933649
TotalMilliseconds : 93,3649

কেউ কি এটা আমাকে ব্যাখ্যা করতে পারে?

উত্তর:


13

লেখক যদি আরও সহায়ক প্রমাণ না দেয়, সম্ভবত তিনি কেবল উত্তপ্ত বাতাসে পূর্ণ ছিলেন। আপনি পরীক্ষা চালিয়েছেন এবং ফলাফল পেয়েছেন এবং তাকে ভুল প্রমাণ করেছেন।

সম্পাদনা করুন: জেফরি স্নোভারের ব্লগ থেকে:

ফিল্টার একটি ফাংশন যা কেবল একটি প্রক্রিয়া স্ক্রিপ্টব্লক থাকে

উভয়টির অভিন্ন প্রক্রিয়া ব্লক দেওয়া থাকলেই ফিল্টারটির কোনও ক্রিয়াকলাপের সাথে গতি বাড়িয়ে দেওয়ার বিষয়টি আমাকে বোঝানোর পক্ষে যথেষ্ট নয়।

এছাড়াও সেই সংখ্যার 1950 টি সরঞ্জাম কী ধরণের যেখানে একটি সংখ্যায় একটি যুক্ত করতে 4.6 সেকেন্ড সময় লাগে?

PS C:\Users\Ryan> Measure-Command { Filter AddOne { $_ + 1 }; AddOne 1 }

TotalMilliseconds : 7.7266


PS C:\Users\Ryan> Measure-Command { Function AddOne { $_ + 1 }; AddOne 1 }    

TotalMilliseconds : 0.4108

4.6 সেকেন্ড হ'ল ধাক্কা। বাইনারি নেজেন হওয়ার আগে লেখক পাওয়ার পাওয়ারের কোনও ধরণের সিটিপি সংস্করণ ব্যবহার করছিলেন। : P: P

শেষ পর্যন্ত, নতুন পাওয়ারশেল সেশনে আপনার পরীক্ষাটি চেষ্টা করে দেখুন, তবে বিপরীত ক্রমে। প্রথমে ফাংশনটি এবং দ্বিতীয়টি ফিল্টার চেষ্টা করুন বা তার বিপরীতে:

PS C:\Users\Ryan> Measure-Command { Function AddOne { $_ + 1 }; AddOne 1 }    

TotalMilliseconds : 6.597    


PS C:\Users\Ryan> Measure-Command { Filter AddOne { $_ + 1 }; AddOne 1 }

TotalMilliseconds : 0.4055

দেখা? আপনি চালিত প্রথমটি সর্বদা ধীর হবে। এটি মেমরিতে ইতিমধ্যে স্ট্যান্ডগুলি লোড করার জন্য। নেট নেটওয়ার্কগুলি সম্পর্কে যা দ্বিতীয় ক্রিয়াকলাপটি দ্রুততর করে তোলে এটি কোনও ফাংশন বা ফিল্টার নির্বিশেষে।

যদিও আমি স্বীকার করব যে ফাংশনটি ফিল্টারটির তুলনায় ধারাবাহিকভাবে দ্রুততর বলে মনে হচ্ছে, এটি যতবার চালিত হোক না কেন।

Measure-Command { Function AddOne($Num) { Return $Num += 1 }; 1..50000 | AddOne $_ }

TotalMilliseconds : 13.9813

Measure-Command { Filter AddOne($Num) { Return $Num += 1 }; 1..50000 | AddOne $_ }

TotalMilliseconds : 69.5301

সুতরাং লেখকটি ভুল ছিল ... এবং এখন কখনও কোনও ফাংশনের পরিবর্তে ফিল্টার ব্যবহার না করায় খারাপ লাগছে না।


4

আসলে আপনি উভয় পরীক্ষায় একই $ _ ব্যবহার করলে পার্থক্য অনেক কম। আমি কারণটি তদন্ত করিনি, তবে আমি মনে করি কারণ এটি লেখক উভয় পরীক্ষায় একই পদ্ধতির ব্যবহার করছেন না। এছাড়াও, কনসোল আউটপুট ফলাফলগুলিতে হস্তক্ষেপ করতে পারে। আপনি যদি এই অংশগুলি কাটা করেন তবে সংখ্যাগুলি খুব মিল। দেখা:

Function AddOneFunction
{  
    process {
        $_ + 1
    }
}

Filter AddOneFilter
{ 
    $_ + 1
}

write-host "First"
Measure-Command { 1..50000 | AddOneFilter } | select totalMilliseconds
Measure-Command { 1..50000 | AddOneFilter } | select totalMilliseconds
Measure-Command { 1..50000 | AddOneFilter } | select totalMilliseconds
Measure-Command { 1..50000 | AddOneFilter } | select totalMilliseconds
Measure-Command { 1..50000 | AddOneFilter } | select totalMilliseconds

write-host "Second"
Measure-Command { 1..50000 | AddOneFunction } | select totalMilliseconds
Measure-Command { 1..50000 | AddOneFunction } | select totalMilliseconds
Measure-Command { 1..50000 | AddOneFunction } | select totalMilliseconds
Measure-Command { 1..50000 | AddOneFunction } | select totalMilliseconds
Measure-Command { 1..50000 | AddOneFunction } | select totalMilliseconds

আপনি আদেশগুলির ক্রম পরিবর্তন করলেও ফলাফলগুলি খুব কাছাকাছি থাকবে।

First

TotalMilliseconds
-----------------
        84.6742
        84.7646
        89.8603
        82.3399
        83.8195
Second
        86.8978
        87.4064
        89.304
        94.4334
        87.0135

ডকুমেন্টেশনে আরও বলা হয়েছে যে ফিল্টারগুলি মূলত কেবলমাত্র প্রক্রিয়া ব্লক সহ ফাংশনগুলির শর্টকাট। কোনও প্রসেস ব্লক (বা কিছু অন্যান্য কৌশল যেমন স্বয়ংক্রিয় ভেরিয়েবলগুলি যেমন $ ইনপুট) ব্যবহার করে সুনির্দিষ্ট না করা থাকলে একবার চালনা করুন, ইনপুটটি ব্যবহার করবেন না এবং পাইপলাইনে পরবর্তী কমান্ডে প্রবেশ করবেন না।

Https://technet.microsoft.com/en-us/library/hh847829.aspx এবং https : //technet.mic Microsoft.com/en-us/library/hh847781.aspx এ আরও তথ্য

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