Q1: कोड प्रोफाइलिंग (प्रोफाइलिंग, बेंचमार्किंग नहीं) के लिए आप कौन से टूल का उपयोग कर रहे हैं?
Q2: कब तक आप कोड को चलाने दें (आंकड़े: कितने समय के कदम)?
Q3: कितने बड़े मामले हैं (यदि मामला कैश में फिट बैठता है, तो सॉल्वर तेजी से परिमाण के आदेश है, लेकिन फिर मैं स्मृति संबंधित प्रक्रियाओं को याद करूंगा)?
यहाँ एक उदाहरण है कि मैं इसे कैसे करता हूँ।
मैं बेंचमार्किंग (यह देखते हुए कि इसमें कितना समय लगता है) को अलग करना (पहचान करना कि इसे कैसे तेज किया जाए)। यह महत्वपूर्ण नहीं है कि प्रोफाइलर तेज हो। यह महत्वपूर्ण है कि यह आपको बताए कि क्या ठीक करना है।
मुझे "प्रोफाइलिंग" शब्द भी पसंद नहीं है क्योंकि यह एक छवि को हिस्टोग्राम की तरह बनाता है, जहाँ प्रत्येक रूटीन के लिए एक कॉस्ट-बार, या "अड़चन" होती है क्योंकि इसका मतलब है कि कोड में बस थोड़ी सी जगह है जिसे होना चाहिए तय की। ये दोनों बातें किसी प्रकार के समय और आँकड़ों को दर्शाती हैं, जिसके लिए आप सटीकता को महत्वपूर्ण मानते हैं। यह समय की सटीकता के लिए अंतर्दृष्टि देने के लायक नहीं है।
मेरे द्वारा उपयोग की जाने वाली विधि यादृच्छिक ठहराव है, और यहां एक पूरा मामला अध्ययन और स्लाइड शो है । प्रोफाइलर-टोंटी दुनिया के दृश्य का हिस्सा यह है कि अगर आपको कुछ नहीं मिलता है, तो कुछ भी नहीं मिल रहा है, और यदि आप कुछ पाते हैं और एक निश्चित प्रतिशत गति प्राप्त करते हैं, तो आप जीत की घोषणा करते हैं और छोड़ देते हैं। प्रोफाइलर प्रशंसक लगभग कभी नहीं कहते हैं कि उन्हें कितना स्पीडअप मिलता है, और विज्ञापन केवल कृत्रिम रूप से होने वाली समस्याओं को दिखाते हैं जिन्हें खोजने में आसान होना चाहिए। बेतरतीब ठहराव समस्याओं को ढूँढता है चाहे वे आसान हों या कठोर। फिर एक समस्या को ठीक करना दूसरों को उजागर करता है, इसलिए जटिल गति को प्राप्त करने के लिए प्रक्रिया को दोहराया जा सकता है।
कई उदाहरणों से मेरे अनुभव में, यहां बताया गया है: मैं एक समस्या (यादृच्छिक ठहराव द्वारा) पा सकता हूं और इसे ठीक कर सकता हूं, कुछ प्रतिशत का स्पीडअप प्राप्त कर सकता हूं, 30% या 1.3x कह सकता हूं। फिर मैं इसे फिर से कर सकता हूं, एक और समस्या ढूंढ सकता हूं और इसे ठीक कर सकता हूं, एक और स्पीडअप प्राप्त कर सकता हूं, शायद 30% से कम, शायद अधिक। तब मैं इसे फिर से कर सकता हूं, कई बार जब तक मैं वास्तव में ठीक करने के लिए और कुछ नहीं पा सकता हूं। अंतिम स्पीडअप कारक व्यक्तिगत कारकों का चलने वाला उत्पाद है, और यह आश्चर्यजनक रूप से बड़ा हो सकता है - कुछ मामलों में परिमाण के आदेश।
सम्मिलित: इस अंतिम बिंदु को स्पष्ट करने के लिए। स्लाइड शो और सभी फाइलों के साथ यहां एक विस्तृत उदाहरण है , जिसमें दिखाया गया है कि समस्या को हटाने की एक श्रृंखला में 730x का स्पीडअप कैसे प्राप्त किया गया था। पहले संस्करण में 2700 माइक्रोसेकंड प्रति यूनिट काम लिया गया। समस्या ए को हटा दिया गया था, समय को 1800 तक लाया गया, और शेष समस्याओं के प्रतिशत को 1.5x (2700/1800) तक बढ़ाया। तब B को हटा दिया गया था। यह प्रक्रिया छह पुनरावृत्तियों के माध्यम से जारी रही, जिसके परिणामस्वरूप परिमाण गति के लगभग 3 क्रम थे। लेकिन प्रोफाइलिंग तकनीक को वास्तव में प्रभावोत्पादक होना चाहिए, क्योंकि यदि उनमें से कोई भी समस्या नहीं पाई जाती है, अर्थात यदि आप एक ऐसे बिंदु पर पहुँच जाते हैं जहाँ आप गलत तरीके से सोचते हैं कि कुछ और नहीं किया जा सकता है, तो प्रक्रिया रुक जाती है।
INSERTED: इसे दूसरे तरीके से रखने के लिए, यहाँ कुल स्पीड कारक का एक ग्राफ रखा गया है क्योंकि लगातार समस्याएं दूर की जाती हैं:
तो क्यू 1 के लिए, एक साधारण टाइमर प्रत्यय बेंचमार्किंग के लिए। "प्रोफाइलिंग" के लिए मैं यादृच्छिक ठहराव का उपयोग करता हूं।
Q2: मैं इसे पर्याप्त कार्यभार देता हूं (या बस इसके चारों ओर एक लूप डाल देता हूं) इसलिए यह ठहराव के लिए काफी लंबा चलता है।
Q3: सभी तरीकों से, इसे वास्तविक रूप से बड़े कार्यभार दें ताकि आप कैश की समस्याओं को याद न करें। मेमोरी कोड कर रहे कोड में नमूने के रूप में दिखाई देंगे।