2008-09-22 11 views
7

मैं कुल नौसिखिया हूं, लेकिन मैं एक छोटा प्रोग्राम लिख रहा था जो सी # में तारों पर काम करता था और मैंने देखा कि अगर मैंने कुछ चीजें अलग-अलग की हैं, तो कोड काफी तेजी से निष्पादित हुआ।गति के लिए अपने कोड का परीक्षण?

तो यह मुझे आश्चर्यचकित कर रहा था, आप अपने कोड की निष्पादन गति को घड़ी के बारे में कैसे जाते हैं? क्या कोई (मुफ्त) उपयोगिताएं हैं? क्या आप इसके बारे में सिस्टम के साथ पुराने तरीके से जाते हैं। टिमर और इसे स्वयं करें?

उत्तर

12

जो आप वर्णन कर रहे हैं उसे प्रदर्शन प्रोफाइलिंग के रूप में जाना जाता है। ऐसे कई कार्यक्रम हैं जिन्हें आप Jetbrains profiler या Ants profiler ऐसा करने के लिए प्राप्त कर सकते हैं, हालांकि अधिकांश अपने प्रदर्शन को मापने की प्रक्रिया में आपके आवेदन को धीमा कर देंगे।

अपनी खुद की प्रदर्शन प्रोफाइलिंग को हाथ से रोल करने के लिए, आप System.Diagnostics.Stopwatch और एक साधारण कंसोल का उपयोग कर सकते हैं। जैसा कि आपने वर्णन किया है।

यह भी ध्यान रखें कि सी # जेआईटी कंपाइलर इसे टाइप किए जाने वाले प्रकार और आवृत्ति के आधार पर कोड अनुकूलित करता है, इसलिए अलग-अलग आकारों और विधियों जैसे लापरवाही कॉल के तरीकों के साथ खेलें जो सर्वोत्तम काम करता है।

+0

+1: वह स्टॉपवॉच त्वरित जांच के लिए एक आसान छोटी उपयोगिता है - धन्यवाद! –

0

मैं निम्नलिखित बातें करता हूं: 1) मैं वर्तमान समय को मापने के लिए टिक (जैसे VB.Net Now.ticks) का उपयोग करता हूं। मैं समाप्त टिकों के मूल्य से शुरुआती टिक घटाता हूं और टाइमस्पेन द्वारा विभाजित करता हूं। यह पता लगाने के लिए कितने सेकंड लगते हैं। 2) मैं यूआई ऑपरेशंस से बचता हूं (जैसे console.writeline)। 3) मैं जितना संभव हो उतना उपयोग/ओएस वैरिएबल को कारक बनाने के लिए पर्याप्त लूप (जैसे 100,000 पुनरावृत्तियों) पर कोड चलाता हूं।

11

ANTS Profiler from RedGate वास्तव में एक अच्छा प्रदर्शन प्रोफाइलर है। dotTrace Profiler from JetBrains भी महान है। ये टूल आपको प्रदर्शन मीट्रिक देखने की अनुमति देंगे जिन्हें प्रत्येक व्यक्तिगत पंक्ति को ड्रिल किया जा सकता है।

रोड़ी चींटियों प्रोफाइलर के शॉट: ANTS http://www.red-gate.com/products/ants_profiler/images/app/timeline_calltree3.gif

आप यह सुनिश्चित करना है कि एक विशिष्ट विधि इकाई परीक्षण के दौरान एक विशेष प्रदर्शन के सीमा के भीतर रहता है चाहते हैं, मैं Stopwatch class का प्रयोग करेंगे एक विधि एक अयस्क का निष्पादन समय पर नजर रखने के लूप में कई बार और परिणाम के मुकाबले औसत और फिर Assert की गणना करें।

+0

हम इसका उपयोग करते हैं। यह एक दिनचर्या खोजने में बहुत प्रभावी है जो 9 5% समय लेता है! –

0

आप स्टॉपवॉच क्लास का समय विधियों का उपयोग कर सकते हैं। याद रखें कि कोड होने के कारण पहली बार धीमा होता है।

7

बस एक अनुस्मारक - रिबेज में संकलन करना सुनिश्चित करें, डीबग नहीं! (मैंने अनुभवी डेवलपर्स द्वारा बनाई गई यह गलती देखी है - इसे भूलना आसान है)।

+0

मैं थोड़ा अलग होना चाहता हूं। Speedups खोजने के लिए, डीबग मोड में काम करना सबसे अच्छा है। जब सब उसके साथ किया जाता है, तो रिलीज मोड पर स्विच करें। कारण यह है - यदि कोड कुछ कामों को कॉल करने जैसे मूर्खतापूर्ण चीजें कर रहा है, या आवश्यकतानुसार स्मृति आवंटित/मुक्त करना, या I/O करना आपको एहसास नहीं हुआ है, तो रिलीज़ मोड इसे ठीक नहीं करेगा। यह केवल इसे खोजने में मुश्किल होगी। –

2

आप 'प्रदर्शन ट्यूनिंग' का वर्णन क्या कर रहे हैं। जब हम प्रदर्शन ट्यूनिंग के बारे में बात करते हैं तो इसमें दो कोण होते हैं। (ए) प्रतिक्रिया समय - किसी विशेष अनुरोध/कार्यक्रम को निष्पादित करने में कितना समय लगता है। (बी) थ्रूपुट - दूसरे में यह कितने अनुरोध निष्पादित कर सकते हैं। जब हम आम तौर पर 'ऑप्टिमाइज़' करते हैं - जब हम अनावश्यक प्रसंस्करण को समाप्त करते हैं तो दोनों प्रतिक्रिया समय के साथ-साथ थ्रूपुट में सुधार होता है।हालांकि अगर आपके पास कोड में घटनाएं हैं (जैसे थ्रेड.sleep(), I/O प्रतीक्षा आदि) तो आपका प्रतिक्रिया समय प्रभावित होता है हालांकि थ्रूपुट प्रभावित नहीं होता है। समांतर प्रसंस्करण (कई धागे फैलाने) को अपनाने से हम प्रतिक्रिया समय में सुधार कर सकते हैं लेकिन थ्रूपुट में सुधार नहीं किया जाएगा। आम तौर पर सर्वर साइड एप्लिकेशन के लिए प्रतिक्रिया समय और थ्रूपुट दोनों महत्वपूर्ण हैं। डेस्कटॉप अनुप्रयोगों (जैसे आईडीई) थ्रूपुट के लिए महत्वपूर्ण नहीं है केवल प्रतिक्रिया समय महत्वपूर्ण है।

आप 'प्रदर्शन परीक्षण' द्वारा प्रतिक्रिया समय को माप सकते हैं - आप केवल सभी महत्वपूर्ण लेनदेन के लिए प्रतिक्रिया समय को नोट करते हैं। आप 'लोड टेस्टिंग' द्वारा थ्रूपुट को माप सकते हैं - आपको पर्याप्त रूप से बड़ी संख्या में धागे/क्लाइंट से अनुरोध पंप करने की आवश्यकता है जैसे कि सर्वर मशीन का सीपीयू उपयोग 80-90% है। जब हम अनुरोध पंप करते हैं तो हमें विभिन्न लेनदेन (लेनदेन मिश्रण कहा जाता है) के बीच अनुपात बनाए रखने की आवश्यकता होती है - उदाहरण के लिए: आरक्षण प्रणाली में प्रत्येक 100 खोज के लिए 10 बुकिंग होगी। प्रत्येक 10 बुकिंग इत्यादि के लिए रद्दीकरण होगा

लेनदेन की पहचान करने के बाद प्रतिक्रिया समय (प्रदर्शन परीक्षण) के लिए ट्यूनिंग की आवश्यकता होती है, आप प्रोफाइलर का उपयोग करके हॉट स्पॉट की पहचान कर सकते हैं। आप उस लेनदेन के प्रतिक्रिया समय * अंश की तुलना करके थ्रूपुट के लिए हॉट स्पॉट की पहचान कर सकते हैं। खोज, बुकिंग, रद्दीकरण परिदृश्य में मान लें, अनुपात 89: 10: 1 है। प्रतिक्रिया समय 0.1 सेकंड, 10 सेकंड और 15 सेकंड हैं। खोज के लिए लोड - 0.1 * .89 = 0.089 बुकिंग के लिए लोड- 10 * .1 = 1 कैनसेल = 15 * .01 = 0.15 के लिए लोड यहां ट्यूनिंग बुकिंग थ्रूपुट पर अधिकतम प्रभाव प्रदान करेगी। आप थ्रेड डंप (जावा आधारित अनुप्रयोगों के मामले में) बार-बार ले कर थ्रूपुट के लिए हॉट स्पॉट की पहचान भी कर सकते हैं।

0

एक देशी .NET विकल्प (सॉफ्टवेयर डेवलपर्स के लिए टीम संस्करण) है जो कुछ प्रदर्शन विश्लेषण आवश्यकताओं को संबोधित कर सकता है। 2005 नेट आईडीई मेनू से, उपकरण> प्रदर्शन उपकरण> प्रदर्शन जादूगर का चयन करें ...

[जीएसएस शायद सही है कि आप टीम संस्करण होना आवश्यक है]

0

यह परीक्षण कोड गति के लिए सरल उदाहरण है। मुझे आशा है कि मैंने आपकी मदद की

class Program { 
    static void Main(string[] args) { 
     const int steps = 10000; 
     Stopwatch sw = new Stopwatch(); 

     ArrayList list1 = new ArrayList(); 
     sw.Start(); 
     for(int i = 0; i < steps; i++) { 
      list1.Add(i); 
     } 
     sw.Stop(); 
     Console.WriteLine("ArrayList:\tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks); 

     MyList list2 = new MyList(); 
     sw.Start(); 
     for(int i = 0; i < steps; i++) { 
      list2.Add(i); 
     } 
     sw.Stop(); 
     Console.WriteLine("MyList: \tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks); 
संबंधित मुद्दे