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

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

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

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

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


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

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

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 प्रतिदर्श अवधि का वर्गमूल है।"

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

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

समर्पित हार्डवेयर इससे आगे जा सकता है एआरएस कॉर्टेक्स-एम3 (ARM Cortex-M3) और कुछ हाल के एमआईपीएस (MIPS) प्रोसेसर जेटीएजी (JTAG) इंटरफ़ेस में एक पीसीएससैम्पल (PCSAMPLE) पंजीकृत है, जो प्रोग्राम गणक को वास्तव में असंसूचनीय तरीके से प्रतिरूप करता है, जिससे एक समलत प्रोफाइल के हस्तक्षेप करने वाले संग्रह को अनुमति मिलती है।

जावा/प्रबंधित कोड के लिए प्रायः उपयोग किए जाने वाले कुछ सांख्यिकीय प्रोफाइलर स्मार्टबियर सॉफ्टवेयर के एक्यू समय (AQtime) और माइक्रोसॉफ्ट के सीएलआर(CLR) प्रोफाइलर हैं। वे प्रोफाइलर प्राकृत कोड रूपरेखा का भी समर्थन करते हैं, साथ ही Apple Inc. का शार्क (OSX), ओप्रोफाइल (लिनक्स), इंटेल वीट्यून (Intel VTune) और समांतर प्रवर्धक (इंंटेल समांतर स्टुडियो का हिस्सा), और ओरेकल कार्पोरेशन प्रदर्शन विश्लेषक, अन्य लोगों के बीच।

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

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

अनुवादक उपकरण

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

हाइपरविजर/अनुरूपक

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

यह भी देखें

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

बाहरी संबंध

 * 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