विज्ञान की स्थापना
सबसे पहले, कुछ स्क्रिप्ट हमें यह परीक्षण करने में मदद करने के लिए। यह 2000 स्क्रिप्ट फ़ाइलों को उत्पन्न करता है, प्रत्येक एक छोटे से फ़ंक्शन के साथ:
1..2000 | % { "Function Test$_(`$someArg) { Return `$someArg * $_ }" > "test$_.ps1" }
सामान्य स्टार्टअप ओवरहेड को बहुत ज्यादा मायने नहीं रखने के लिए पर्याप्त होना चाहिए। आप चाहें तो और जोड़ सकते हैं। यह उन सभी को डॉट-सोर्सिंग का उपयोग करके लोड करता है:
dir test*.ps1 | % {. $_.FullName}
यह उनकी सामग्री को पहले पढ़कर उन सभी को लोड करता है:
dir test*.ps1 | % {iex (gc $_.FullName -Raw)}
अब हमें कुछ गंभीर निरीक्षण करने की आवश्यकता है कि पॉवरशेल कैसे काम करता है। मैं एक decompiler के लिए JetBrains dotPeek पसंद करता हूं । यदि आपने कभी .NET अनुप्रयोग में PowerShell को एम्बेड करने का प्रयास किया है , तो आप पाएंगे कि विधानसभा जिसमें अधिकांश प्रासंगिक सामान शामिल हैं System.Management.Automation। Decompile कि एक परियोजना और एक PDB में।
यह देखने के लिए कि यह सारा रहस्यमय समय कहाँ बिताया जा रहा है, हम एक प्रोफाइलर का उपयोग करेंगे। मैं विजुअल स्टूडियो में निर्मित एक को पसंद करता हूं। इसका उपयोग करना बहुत आसान है । प्रतीक स्थानों के लिए पीडीबी युक्त फ़ोल्डर जोड़ें । अब, हम एक PowerShell उदाहरण की प्रोफाइलिंग रनिंग कर सकते हैं जो कि केवल एक परीक्षण स्क्रिप्ट चलाता है। ( -Fileकोशिश करने के लिए पहली स्क्रिप्ट के पूर्ण पथ के साथ उपयोग करने के लिए कमांड-लाइन पैरामीटर सेट करें। छोटे स्क्रिप्ट वाले फ़ोल्डर में स्टार्टअप स्थान सेट करें। एक बार ऐसा हो जाने के बाद, powershell.exeलक्ष्य और परिवर्तन के तहत प्रविष्टि पर गुण खोलें। अन्य स्क्रिप्ट का उपयोग करने के लिए तर्क। फिर प्रदर्शन एक्सप्लोरर में सबसे ऊपरी आइटम पर राइट-क्लिक करें और प्रारंभ प्रोफ़ाइल चुनें। प्रोफाइलर दूसरी स्क्रिप्ट का उपयोग करके फिर से चलता है। अब हम तुलना कर सकते हैं। सुनिश्चित करें कि यदि आप विकल्प देते हैं तो "सभी कोड दिखाएं" पर क्लिक करें; मेरे लिए, जो नमूना रूपरेखा रिपोर्ट के सारांश दृश्य में सूचना क्षेत्र में दिखाई देता है।
नतीजे आते हैं
मेरी मशीन पर, Get-Content2000 स्क्रिप्ट फ़ाइलों के माध्यम से जाने के लिए संस्करण को 9 सेकंड का समय लगा। "हॉट पाथ" पर महत्वपूर्ण कार्य थे:
Microsoft.PowerShell.Commands.GetContentCommand.ProcessRecord
Microsoft.PowerShell.Commands.InvokeExpressionCommand.ProcessRecord
यह बहुत मायने रखता है: हमें Get-Contentडिस्क से सामग्री को पढ़ने के लिए इंतजार करना होगा, और हमें Invoke-Expressionउन सामग्रियों के उपयोग के लिए इंतजार करना होगा ।
डॉट-सोर्स संस्करण पर, मेरी मशीन ने उन फाइलों के माध्यम से काम करने के लिए 15 सेकंड से थोड़ा अधिक समय बिताया। इस बार, हॉट पाथ पर काम देशी तरीके थे:
WinVerifyTrust
CodeAuthzFullyQualifyFilename
दूसरा वहाँ अनिर्दिष्ट प्रतीत होता है, लेकिन WinVerifyTrust"एक निर्दिष्ट वस्तु पर एक विश्वास सत्यापन कार्रवाई करता है।" यह उतना ही अस्पष्ट है जितना आप प्राप्त कर सकते हैं, लेकिन दूसरे शब्दों में, यह फ़ंक्शन किसी दिए गए प्रदाता का उपयोग करके किसी दिए गए संसाधन की प्रामाणिकता की पुष्टि करता है। ध्यान दें कि मैंने PowerShell के लिए कोई फैंसी सुरक्षा सामग्री सक्षम नहीं की है, और मेरी स्क्रिप्ट निष्पादन नीति है Unrestricted।
इसका मतलब है
संक्षेप में, आप किसी तरह से सत्यापित की जाने वाली प्रत्येक फ़ाइल की प्रतीक्षा कर रहे हैं, संभवतः हस्ताक्षर के लिए जाँच की जाती है, भले ही यह आवश्यक नहीं है जब आप उन स्क्रिप्ट को प्रतिबंधित नहीं करते हैं जिन्हें चलाने की अनुमति है। जब आप gcऔर फिर iexसामग्री, यह ऐसा है जैसे आपने कंसोल पर फ़ंक्शन टाइप किया है, इसलिए सत्यापित करने के लिए कोई संसाधन नहीं है।