ডট-সোর্সিং কি কেবল ফাইলের সামগ্রী পড়ার চেয়ে ধীর হয়?


13

আমি একটি পাওয়ারশেল মডিউল লিখেছি যা বিভিন্ন উত্স ফাইলগুলি (যেমন ফাংশন প্রতি এক। পিএস 1 ফাইল) থেকে ফাংশন সংজ্ঞা টানতে পারে। এটি আমাদের (একটি দল হিসাবে) সমান্তরালে বিভিন্ন ফাংশনে কাজ করার অনুমতি দেয়। মডিউলটি (.psm1 ফাইল) উপলব্ধ .ps1 ফাইলগুলির তালিকা পেয়েছে ...

$Functions = Get-ChildItem -Path $FunctionPath *.ps1

... তারপরে তালিকাটি ছড়িয়ে যাবে এবং ডট-সোর্সিংয়ের মাধ্যমে প্রতিটি ফাংশন সংজ্ঞায় টান:

foreach($Function in $Functions) {
  . $Function.Fullname                                     # Can be slow
}

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

ডিস্ক অ্যাক্সেস নিয়ে যদি সমস্যা হয় এবং আমরা খুব সহজেই ডিস্ক থেকে কীভাবে পড়তে পারি তা পরীক্ষা করে দেখে আমরা অবাক হয়েছি। দেখা যাচ্ছে যে এই Get-Contentসমস্ত ফাইল জুড়ে দৌড়াদৌড়ি খুব দ্রুত ছিল, যা আমরা সমস্যার সমাধানের জন্য সুবিধা নিয়েছি:

foreach($Function in $Functions) {
  Invoke-Expression (Get-Content $Function.Fullname -Raw)  # Is quick
}

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

উত্তর:


17

বিজ্ঞান স্থাপন

প্রথমে এটি পরীক্ষা করতে আমাদের সহায়তা করার জন্য কয়েকটি স্ক্রিপ্ট। এটি একক ছোট ফাংশন সহ 2000 টি স্ক্রিপ্ট ফাইল উত্পন্ন করে:

1..2000 | % { "Function Test$_(`$someArg) { Return `$someArg * $_ }" > "test$_.ps1" }

সাধারণ স্টার্টআপ ওভারহেডকে খুব বেশি গুরুত্ব দেয় না সে জন্য এটি পর্যাপ্ত হওয়া উচিত। আপনি চাইলে আরও যোগ করতে পারেন। এটি ডট-সোর্সিং ব্যবহার করে এগুলি সমস্ত লোড করে:

dir test*.ps1 | % {. $_.FullName}

এটি প্রথমে তাদের বিষয়বস্তু পড়ে সমস্ত লোড করে:

dir test*.ps1 | % {iex (gc $_.FullName -Raw)}

পাওয়ারশেল কীভাবে কাজ করে সে সম্পর্কে এখন আমাদের কিছু গুরুতর পরিদর্শন করা দরকার। আমি ডেটম্পাইলারের জন্য জেটব্রেইনস ডটপিক পছন্দ করি । আপনি কি কখনো করার চেষ্টা করে থাকেন তাহলে একটি .NET আবেদন এম্বেড PowerShell , আপনি পাবেন সমাবেশ প্রাসঙ্গিক কাপড় অধিকাংশ রয়েছে যে System.Management.Automation। এটিকে একটি প্রকল্প এবং একটি পিডিবিতে ছড়িয়ে দিন।

এই রহস্যময় সময়টি কোথায় ব্যয় হচ্ছে তা দেখতে, আমরা একটি প্রোফাইলার ব্যবহার করব। আমি ভিজ্যুয়াল স্টুডিওতে নির্মিত একটি পছন্দ করি। এটি ব্যবহার করা খুব সহজপ্রতীক অবস্থানগুলিতে PDB যুক্ত ফোল্ডার যুক্ত করুন । এখন, আমরা একটি পাওয়ারশেলের উদাহরণের একটি প্রোফাইলিং রান করতে পারি যা পরীক্ষার স্ক্রিপ্টগুলির মধ্যে কেবল একটি চালায়। ( -Fileচেষ্টা করার জন্য প্রথম স্ক্রিপ্টের পুরো পথটি ব্যবহার করতে কমান্ড-লাইন প্যারামিটারগুলি সেট করুন all সমস্ত ক্ষুদ্র স্ক্রিপ্টযুক্ত ফোল্ডারে প্রারম্ভের অবস্থানটি সেট করুন)) এটি শেষ হয়ে গেলে powershell.exeলক্ষ্যগুলির অধীনে এন্ট্রিতে সম্পত্তিগুলি খুলুন এবং পরিবর্তন করুন অন্যান্য স্ক্রিপ্ট ব্যবহার করার জন্য আর্গুমেন্ট। তারপরে পারফরম্যান্স এক্সপ্লোরারের শীর্ষতম আইটেমটিতে ডান ক্লিক করুন এবং প্রারম্ভিক প্রোফাইল নির্বাচন করুন। প্রোফাইলারটি অন্য স্ক্রিপ্টটি ব্যবহার করে আবার চলবে। এখন আমরা তুলনা করতে পারেন। বিকল্পটি দেওয়া থাকলে নিশ্চিত করুন যে আপনি "সমস্ত কোড দেখান" ক্লিক করেছেন; আমার জন্য, এটি নমুনা প্রোফাইলিং প্রতিবেদনের সংক্ষিপ্ত দৃশ্যে একটি বিজ্ঞপ্তি অঞ্চলে প্রদর্শিত হবে।

ফলাফল আসে

আমার মেশিনে, Get-Contentসংস্করণটি 2000 স্ক্রিপ্ট ফাইলগুলিতে যেতে 9 সেকেন্ড সময় নিয়েছিল "হট পাথ" এর গুরুত্বপূর্ণ ক্রিয়াগুলি ছিল:

Microsoft.PowerShell.Commands.GetContentCommand.ProcessRecord
Microsoft.PowerShell.Commands.InvokeExpressionCommand.ProcessRecord

এটি অনেকটা অর্থবহ করে: আমাদের Get-Contentডিস্ক থেকে সামগ্রীটি পড়ার জন্য অপেক্ষা Invoke-Expressionকরতে হবে এবং সেই সামগ্রীগুলি ব্যবহার করার জন্য আমাদের অপেক্ষা করতে হবে।

বিন্দু-উত্স সংস্করণে, আমার মেশিনটি এই ফাইলগুলির মাধ্যমে কাজ করতে 15 সেকেন্ডেরও বেশি সময় ব্যয় করেছে। এবার, হট পাথের ফাংশনগুলি ছিল দেশীয় পদ্ধতি:

WinVerifyTrust
CodeAuthzFullyQualifyFilename

দ্বিতীয়টি সেখানে অননুমোদিত বলে মনে হচ্ছে, তবে WinVerifyTrust"একটি নির্দিষ্ট বিষয়টিতে একটি বিশ্বাস যাচাইয়ের ক্রিয়া সম্পাদন করে।" এটি যতটা অস্পষ্ট আপনি তা পেতে পারেন তবে অন্য কথায়, এই ফাংশন প্রদত্ত সরবরাহকারীর সাহায্যে প্রদত্ত সংস্থার সত্যতা যাচাই করে। নোট করুন যে আমি পাওয়ারশেলের জন্য কোনও অভিনব সুরক্ষা সামগ্রী সক্ষম করে নেই, এবং আমার স্ক্রিপ্ট কার্যকরকরণের নীতি Unrestricted

মানে কি

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


2
বেন, এই দুর্দান্ত উত্তরের জন্য ধন্যবাদ। মুগ্ধ হয়েছিলেন যে আপনি ডি-সংকলন করেছেন, যা আমি চেষ্টা করার চেয়েও এক ধাপ। আমি দেখতে পাচ্ছি যে কোনও একটি মেশিনে যেখানে এই সমস্যাটি সবচেয়ে তীব্র, সেখানে আপনার পরীক্ষা পদ্ধতি অনুসরণ করতে পারি কিনা। এটি দীর্ঘ সময় নিতে পারে তাই আপনার দম ধরে রাখবেন না!
চার্লি জয়েন্ট 25'17
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.