प्रोफाइलिंग (कंप्यूटर प्रोग्रामिंग)

सॉफ्टवेयर इंजीनियरिंग में, प्रोफाइलिंग ("प्रोग्राम प्रोफाइलिंग", "सॉफ्टवेयर प्रोफाइलिंग") गतिशील प्रोग्राम विश्लेषण का एक रूप है जो मापता है, उदाहरण के लिए, किसी प्रोग्राम का स्थान (मेमोरी) या समय की जटिलता, विशेष निर्देशों का उपयोग, या आवृत्ति और फलन कॉल की अवधि। प्रायः, प्रोफाइलिंग जानकारी प्रोग्राम अनुकूलीकरण और अधिक विशेष रूप से, निष्पादन इंजीनियरिंग में सहायता करने के लिए कार्य करती है।

प्रोफाइलिंग को यंत्र द्वारा प्रोग्राम स्रोत कोड या इसके बाइनरी साध्य (एक्जीक्यूटेबल) रूप को एक प्रोफाइलर (या कोड प्रोफाइलर) नामक उपकरण का उपयोग करके प्राप्त किया जाता है। प्रोफाइलर कई अलग-अलग तकनीकों का उपयोग कर सकते हैं, जैसे कि घटना-आधारित, सांख्यिकीय, यंत्रीकृत और अनुकरण के तरीके।

प्रोग्राम की घटनाओं का संग्रहण
प्रोफाइलर डेटा एकत्र करने के लिए विभिन्न प्रकार की तकनीकों का उपयोग करते हैं, जिनमें हार्डवेयर व्यवधान, कोड उपकरण, निर्देश सेट अनुकरण, ऑपरेटिंग सिस्टम हुक और निष्पादन गणक सम्मिलित हैं।

प्रोफाइलर्स का उपयोग


एक प्रोफाइलर का आउटपुट हो सकता है-

/* स्रोत गणना */
 * देखी गई घटनाओं का एक सांख्यिकीय सारांश (एक प्रोफ़ाइल) सारांश प्रोफ़ाइल जानकारी को प्रायः स्रोत कोड विवरण के विरुद्ध व्याख्या की जाती है जहां घटनाएं होती हैं, इसलिए माप डेटा का आकार प्रोग्राम के कोड आकार के लिए रैखिक होता है।

0001        यदि  X = "A"                   0055

0002          तो करें

0003           X गणना में 1 जोड़े         0032

0004            अतिरिक्त

0005        यदि  X = "B"              0055
 * रिकॉर्ड की गई घटनाओं का स्रोत (एक अनुरेख)
 * अनुक्रमिक प्रोग्रामों के लिए, एक सारांश प्रोफ़ाइल प्रायः पर्याप्त होती है, लेकिन समानांतर प्रोग्रामों (संदेशों या समकालन मुद्दों की प्रतीक्षा) में प्रदर्शन की समस्याएं प्रायः घटनाओं के समय के संबंध पर निर्भर करती हैं, इस प्रकार जो हो रहा है उसे समझने के लिए एक पूर्ण अनुरेख की आवश्यकता होती है। एक (पूर्ण) अनुरेख का आकार प्रोग्राम के निर्देश पथ की लंबाई के लिए रैखिक होता है, जिससे यह कुछ हद तक अव्यावहारिक हो जाता है। इसलिए एक प्रोग्राम में एक बिंदु पर एक अनुरेख प्रारम्भ किया जा सकता है और आउटपुट को सीमित करने के लिए दूसरे बिंदु पर समाप्त किया जा सकता है।

लंबे समय तक चलने वाले कोड को स्पष्ट करके निष्पादन बाधाओं की पहचान करने के लिए एक प्रोफाइलर को एक व्यक्तिगत विधि या प्रतिरूपक (मॉड्यूल) या प्रोग्राम के पैमाने पर लागू किया जा सकता है। विभिन्न कार्यावधि स्थितियों या विभिन्न भारों को संभालने के लिए इसे अनुकूलित करने के उद्देश्य से, समय के दृष्टिकोण से कोड को समझने के लिए एक प्रोफाइलर का उपयोग किया जा सकता है। प्रोफाइलिंग परिणामों को एक संकलक द्वारा ग्रहण किया जा सकता है जो प्रोफाइल-निर्देशित अनुकूलन प्रदान करता है। प्रोफाइलिंग परिणामों का उपयोग व्यक्तिगत एल्गोरिथम के डिजाइन और अनुकूलन को निर्देशित करने के लिए किया जा सकता है क्रॉस मैचिंग वाइल्डकार्ड एल्गोरिथम एक उदाहरण है। प्रोफाइलर्स कुछ एप्लिकेशन निष्पादन प्रबंधन प्रणालियों में निर्मित होते हैं जो वितरित एप्लिकेशनों में लेन-देन कार्यभार में अंतर्दृष्टि प्रदान करने के लिए प्रोफाइलिंग डेटा को एकत्रित करते हैं।
 * हाइपरविजर के साथ एक सतत परस्पर क्रिया (उदाहरण के लिए ऑन-स्क्रीन डिस्प्ले के माध्यम से निरंतर या आवधिक निगरानी) यह (अभी भी निष्पादित) प्रोग्राम के बारे में चल रहे मेट्रिक्स को देखने के अलावा निष्पादन के दौरान किसी भी वांछित बिंदु पर अनुरेख को प्रारम्भ या बंद करने का अवसर प्रदान करता है। यह अन्य समानांतर प्रक्रियाओं के साथ अधिक विस्तार से परस्परिक क्रिया की जांच करने के लिए महत्वपूर्ण बिंदुओं पर अतुल्यकालिक प्रक्रियाओं को निलंबित करने का अवसर भी प्रदान करता है।

इतिहास
1970 के दशक के प्रारम्भ से IBM/360 और IBM/370 प्लेटफॉर्म पर निष्पादन-विश्लेषण उपकरण मौजूद थे, जो प्रायः टाइमरअवरोध पर आधारित होते थे, जो निष्पादन कोड में "हॉट स्पॉट" का पता लगाने के लिए लगाए गए टाइमर-अंतराल पर प्रोग्राम स्थिति शब्द (PSW) रिकॉर्ड करते थे। यह नमूनाकरण का एक प्रारंभिक उदाहरण था (नीचे देखें)। 1974 के प्रारम्भ में निर्देश-लगाए अनुरूपक ने पूर्ण अनुरेख और अन्य निष्पादन-निगरानी सुविधाओं की अनुमति दी।

यूनिक्स पर प्रोफाइलर-संचालित प्रोग्राम विश्लेषण 1973 से प्रारम्भ होता है, जब यूनिक्स प्रणाली में एक बुनियादी उपकरण,  सम्मिलित था, जो प्रत्येक फलन को सूचीबद्ध करता था और प्रोग्राम निष्पादन समय का कितना उपयोग करता था। 1982 में   ने अवधारणा को एक पूर्ण कॉल ग्राफ विश्लेषण तक विस्तारित किया।

1994 में, डिजिटल उपकरण निगम के अमिताभ श्रीवास्तव और एलन यूस्टेस ने एटीओएम (ATOM) (ओएम (OM) के साथ विश्लेषण उपकरण) का वर्णन करते हुए एक पेपर प्रकाशित किया। एटीओएम (ATOM) प्लेटफॉर्म एक प्रोग्राम को अपने स्वयं के प्रोफाइलर में परिवर्तित करता है संकलन समय, यह विश्लेषण किए जाने वाले प्रोग्राम में कोड सम्मिलित करता है। वह सम्मिलित कोड विश्लेषण डेटा को आउटपुट करता है। यह तकनीक स्वयं का विश्लेषण करने के लिए प्रोग्राम को संशोधित करती है - इसे "उपकरण" के रूप में जाना जाता है।

2004 में  और एटीओएम(ATOM) पेपर दोनों ही 1999 में समाप्त होने वाली 20 साल की अवधि के लिए 50 सबसे प्रभावशाली पीएलडीआई (PLDI) पत्रों की सूची में सम्मिलित हुए।

समतल प्रोफाइलर
समतल प्रोफाइलर्स कॉल से औसत कॉल समय की गणना करते हैं, और कैली या संदर्भ के आधार पर कॉल के समय को नहीं तोड़ते हैं।

कॉल-ग्राफ प्रोफाइलर
कॉल ग्राफ प्रोफाइलर्स कॉल के समय, और कार्यों की आवृत्तियों, और कैली के आधार पर सम्मिलित कॉल-चेन भी दिखाते हैं। कुछ उपकरणों में पूर्ण संदर्भ संरक्षित नहीं होता है।

इनपुट-संवेदनशील प्रोफाइलर
इनपुट-संवेदनशील प्रोफाइलर्स इनपुट वर्कलोड की अभिलक्षणों जैसे इनपुट आकार या इनपुट मानों के निष्पादन उपायों से संबंधित समतल या कॉल-ग्राफ प्रोफाइलर्स में एक और आयाम जोड़ते हैं। वे चार्ट उत्पन्न करते हैं जो यह दर्शाते हैं कि किसी एप्लिकेशन का निष्पादन उसके इनपुट के कार्य के रूप में कैसे मापता है।

प्रोफाइलर प्रकारों में डेटा कणिकता
प्रोफाइलर, जो स्वयं भी प्रोग्राम होते हैं, उनके निष्पादन पर जानकारी एकत्र करके लक्षित प्रोग्रामों का विश्लेषण करते हैं। उनकी डेटा कणिकता के आधार पर, कैसे प्रोफाइलर्स जानकारी एकत्र करते हैं, उन्हें घटना आधारित या सांख्यिकीय प्रोफाइलर्स में वर्गीकृत किया जाता है। प्रोफाइलर जानकारी एकत्र करने के लिए प्रोग्राम के निष्पादन को बाधित करते हैं, जिसके परिणामस्वरूप समय मापन में एक सीमित संकल्प हो सकता है, जिसे नमक के दाने के साथ लिया जाना चाहिए। बेसिक ब्लॉक प्रोफाइलर कोड की प्रत्येक पंक्ति को निष्पादित करने के लिए समर्पित कई मशीन घड़ी चक्रों की रिपोर्ट करते हैं, या इन्हें एक साथ जोड़ने के आधार पर एक समय, प्रति बुनियादी ब्लॉक रिपोर्ट किए गए समय द्रुतिका प्राप्ति और चूकने के बीच अंतर को प्रतिबिंबित नहीं कर सकते हैं।

घटना-आधारित प्रोफाइलर
यहां सूचीबद्ध प्रोग्रामिंग भाषाओं में इवेंट-आधारित प्रोफाइलर्स हैं।
 * जावा- जेवीएमटीआई (जेवीएम टूल्स इंटरफेस) एपीआई (API), पूर्व में जेवीएमपीआई (जेवीएम प्रोफाइलिंग इंटरफेस), कॉल, क्लास-भार, अनलोड, थ्रेड एंटर लीव जैसी घटनाओं के प्रग्रहण के लिए प्रोफाइलरों को हुक प्रदान करता है।
 * एनईटी (NET)- प्रोफाइलिंग एपीआई (API) का उपयोग कर सीएलआर (CLR) को एक सीओएम (COM) सर्वर के रूप में एक प्रोफाइलिंग एजेंट संलग्न कर सकता है। जावा की तरह, कार्यावधि तब एजेंट को विभिन्न कॉलबैक प्रदान करता है, JIT / एंटर / लीव, ऑब्जेक्ट निर्माण, आदि विधि जैसी घटनाओं को प्रग्रहण के लिए। विशेष रूप से शक्तिशाली है कि प्रोफाइलिंग एजेंट लक्ष्य एप्लिकेशन के बाइटकोड को मनमाने तरीके से फिर से लिख सकता है।
 * पायथन: पायथन प्रोफाइलिंग में प्रोफाइल मॉड्यूल, हॉटशॉट (जो कॉल-ग्राफ आधारित है), और c_ {कॉल, वापसी, अपवाद}, पायथन_ {कॉल, वापसी, अपवाद} जैसी घटनाओं को अनुरेख करने के लिए 'sys.setprofile' फलन का उपयोग करना सम्मिलित है।
 * रूबी- रूबी भी प्रोफाइलिंग के लिए पायथन के समान इंटरफ़ेस का उपयोग करती है। profile.rb में समतल-प्रोफाइलर, मॉड्यूल और रूबी-प्रोफ एक सी (C)-एक्सटेंशन मौजूद हैं।

सांख्यिकीय प्रोफाइलर्स
कुछ प्रोफाइलर नमूनाकरण द्वारा संचालित होते हैं। एक नमूनाकरण प्रोफाइलर ऑपरेटिंग सिस्टम अवरोध का उपयोग करके नियमित अंतराल पर लक्ष्य प्रोग्राम कॉल ढेर की जांच करता है। नमूनाकरण प्रोफाइल प्रायः संख्यात्मक रूप से कम सटीक और विशिष्ट होते हैं, लेकिन लक्ष्य प्रोग्राम को पूर्ण गति से चलाने की अनुमति देते हैं।

परिणामी डेटा सटीक नहीं हैं, लेकिन एक सांख्यिकीय सन्निकटन है। "त्रुटि की वास्तविक मात्रा आमतौर पर एक से अधिक नमूना अवधि होती है। वास्तव में, यदि कोई मान नमूना अवधि का n गुना है, तो इसमें अपेक्षित त्रुटि n नमूना अवधि का वर्गमूल है।"

व्यवहार में, सैंपलिंग प्रोफाइलर अक्सर अन्य दृष्टिकोणों की तुलना में लक्ष्य कार्यक्रम के निष्पादन की अधिक सटीक तस्वीर प्रदान कर सकते हैं, क्योंकि वे लक्ष्य कार्यक्रम के लिए घुसपैठ नहीं करते हैं, और इस प्रकार उनके कई दुष्प्रभाव नहीं होते हैं (जैसे मेमोरी कैश या निर्देश पर डिकोडिंग पाइपलाइन)। चूंकि वे निष्पादन की गति को ज्यादा प्रभावित नहीं करते हैं, वे उन मुद्दों का पता लगा सकते हैं जो अन्यथा छिपे रहेंगे। वे छोटे, जिन्हें अक्सर रूटीन या 'तंग' लूप कहा जाता है, की लागत के अधिक-मूल्यांकन के प्रति अपेक्षाकृत प्रतिरोधी होते हैं। वे उपयोगकर्ता मोड बनाम इंटरप्टिबल कर्नेल मोड जैसे सिस्टम कॉल प्रोसेसिंग में बिताए गए समय की सापेक्ष मात्रा दिखा सकते हैं।

फिर भी, व्यवधान को संभालने के लिए कर्नेल कोड में सीपीयू चक्रों की मामूली हानि होती है, डायवर्टेड कैश उपयोग होता है, और अबाधित कर्नेल कोड (माइक्रोसेकंड-रेंज गतिविधि) में होने वाले विभिन्न कार्यों को अलग करने में असमर्थ है।

समर्पित हार्डवेयर इससे आगे जा सकता है: ARM Cortex-M3 और कुछ हाल के MIPS प्रोसेसर JTAG इंटरफ़ेस में एक PCSAMPLE रजिस्टर है, जो कार्यक्रम गणक को वास्तव में undetectable तरीके से सैंपल करता है, जिससे एक फ्लैट प्रोफाइल के गैर-दखल देने वाले संग्रह की अनुमति मिलती है।

कुछ आमतौर पर इस्तेमाल किया Java/प्रबंधित कोड के लिए सांख्यिकीय प्रोफाइलर SmartBear Software का AQtime हैं और माइक्रोसॉफ्ट का सीएलआर प्रोफाइलर। वे प्रोफाइलर Apple Inc. के Apple Developer Tools#Shark (OSX) के साथ नेटिव कोड प्रोफाइलिंग का भी समर्थन करते हैं, ओप्रोफाइल (लिनक्स), Intel VTune और Parallel Amplifier (Intel Parallel Studio का हिस्सा), और Oracle Corporation Performance Analyzer, दूसरों के बीच में।

इंस्ट्रुमेंटेशन
यह तकनीक आवश्यक जानकारी एकत्र करने के लिए लक्ष्य कार्यक्रम में प्रभावी रूप से निर्देश जोड़ती है। ध्यान दें कि किसी प्रोग्राम को यंत्र करने से प्रदर्शन में परिवर्तन हो सकता है, और कुछ मामलों में गलत परिणाम और/या heisenbug हो सकते हैं। प्रभाव इस बात पर निर्भर करेगा कि कौन सी जानकारी एकत्र की जा रही है, रिपोर्ट किए गए समय के विवरण के स्तर पर, और बुनियादी ब्लॉक प्रोफाइलिंग का प्रयोग उपकरण के संयोजन के साथ किया जाता है या नहीं। उदाहरण के लिए, प्रत्येक प्रक्रिया/नियमित कॉल को गिनने के लिए कोड जोड़ने से संभवतः प्रत्येक कथन का कितनी बार पालन किया जाता है, यह गिनने से कम प्रभाव पड़ेगा। कुछ कंप्यूटरों में सूचना एकत्र करने के लिए विशेष हार्डवेयर होते हैं; इस मामले में कार्यक्रम पर प्रभाव न्यूनतम है।

इंस्ट्रुमेंटेशन नियंत्रण के स्तर और प्रोफाइलरों के लिए उपलब्ध समय संकल्प की मात्रा निर्धारित करने के लिए महत्वपूर्ण है।
 * मैनुअल: प्रोग्रामर द्वारा निष्पादित, उदा। स्पष्ट रूप से रनटाइम की गणना करने के लिए निर्देशों को जोड़कर, माप एपीआई जैसे कि आवेदन प्रतिक्रिया माप मानक के लिए घटनाओं या कॉलों की गणना करें।
 * स्वचालित स्रोत स्तर: उपकरण नीति के अनुसार स्वचालित उपकरण द्वारा स्रोत कोड में जोड़ा गया उपकरण।
 * इंटरमीडिएट भाषा: कई उच्च-स्तरीय स्रोत भाषाओं के लिए समर्थन देने और (गैर-प्रतीकात्मक) बाइनरी ऑफ़सेट री-राइटिंग मुद्दों से बचने के लिए असेंबली भाषा या विघटित बाईटकोड में जोड़ा गया इंस्ट्रूमेंटेशन।
 * कंपाइलर ने सहायता की
 * बाइनरी अनुवाद: उपकरण एक संकलित निष्पादन योग्य में इंस्ट्रूमेंटेशन जोड़ता है।
 * रनटाइम इंस्ट्रूमेंटेशन: सीधे निष्पादन से पहले कोड को इंस्ट्रूमेंट किया जाता है। प्रोग्राम रन पूरी तरह से टूल द्वारा पर्यवेक्षण और नियंत्रित किया जाता है।
 * रनटाइम इंजेक्शन: रनटाइम इंस्ट्रूमेंटेशन की तुलना में अधिक हल्का। सहायक कार्यों के लिए छलांग लगाने के लिए कोड को रनटाइम पर संशोधित किया जाता है।

दुभाषिया उपकरण

 * दुभाषिया डिबग विकल्प प्रदर्शन मेट्रिक्स के संग्रह को सक्षम कर सकता है क्योंकि दुभाषिया प्रत्येक लक्ष्य कथन का सामना करता है। एक बायटेकोड, नियंत्रण तालिका या समय-समय पर संकलन दुभाषिया तीन उदाहरण हैं जो आमतौर पर लक्ष्य कोड के निष्पादन पर पूर्ण नियंत्रण रखते हैं, इस प्रकार अत्यंत व्यापक डेटा संग्रह अवसरों को सक्षम करते हैं।

हाइपरवाइजर/सिम्युलेटर

 * हाइपरवाइजर: हाइपरवाइजर के तहत (आमतौर पर) अनमॉडिफाइड प्रोग्राम चलाकर डेटा एकत्र किया जाता है। उदाहरण: सिमोन
 * सिम्युलेटर और हाइपरविजर: निर्देश सेट सिम्युलेटर के तहत असंशोधित कार्यक्रम चलाकर डेटा को इंटरैक्टिव और चुनिंदा रूप से एकत्र किया गया।

यह भी देखें

 * एल्गोरिथम दक्षता
 * बेंचमार्क (कंप्यूटिंग)
 * जावा प्रदर्शन
 * प्रदर्शन विश्लेषण उपकरणों की सूची
 * प्रदर्शन अनुप्रयोग प्रोग्रामिंग इंटरफ़ेस आधुनिक माइक्रोप्रोसेसरों पर हार्डवेयर प्रदर्शन काउंटरों के लिए एक पोर्टेबल इंटरफ़ेस (लाइब्रेरी के रूप में) है।
 * प्रदर्शन इंजीनियरिंग
 * प्रदर्शन की भविष्यवाणी
 * प्रदर्शन सुधारना
 * रनटाइम सत्यापन
 * प्रोफ़ाइल-निर्देशित अनुकूलन
 * स्टेटिक कोड विश्लेषण
 * सॉफ्टवेयर पुरातत्व
 * वर्स्ट-केस निष्पादन समय (WCET)

बाहरी संबंध

 * Article "Need for speed &mdash; Eliminating performance bottlenecks" on doing execution time analysis of Java applications using IBM Rational Application Developer.
 * Profiling Runtime Generated and Interpreted Code using the VTune Performance Analyzer