2011-01-03 19 views
5

मैं एमसीटीएस परीक्षा 70-536 माइक्रोस्कोफ्ट नेट फ्रेमवर्क एप्लिकेशन देव फाउंडेशन से अभ्यास की समस्याएं कर रहा हूं, और समस्याओं में से एक दो वर्ग, एक जेनेरिक, एक ऑब्जेक्ट प्रकार बनाना है जो दोनों एक ही काम करते हैं ; जिसमें एक पाश कक्षा का उपयोग करता है और हजारों बार फिर से चलाया जाता है। और टाइमर का उपयोग, दोनों का प्रदर्शन समय। C# generics question पर एक और पोस्ट थी जो एक ही खोज की तलाश में है लेकिन किसी ने जवाब नहीं दिया।जेनिक्स बनाम ऑब्जेक्ट प्रदर्शन

असल में यदि मेरे कोड में मैं जेनेरिक क्लास चलाता हूं तो पहले प्रक्रिया में लॉगर लेता है। यदि मैं ऑब्जेक्ट क्लास से पहले ऑब्जेक्ट क्लास चलाता हूं तो प्रक्रिया में अधिक समय लगता है। पूरा विचार यह साबित करना था कि जेनेरिक तेजी से प्रदर्शन करते हैं।

मैंने कुछ समय बचाने के लिए मूल उपयोगकर्ता कोड का उपयोग किया। मैंने विशेष रूप से कोड के साथ कुछ भी गलत नहीं देखा और परिणाम से परेशान था। क्या कोई एक असामान्य परिणाम क्यों समझा सकता है?

class Program 
{ 
    class Object_Sample 
    {    
     public Object_Sample() 
     { 
      Console.WriteLine("Object_Sample Class"); 
     } 

     public long getTicks() 
     { 
      return DateTime.Now.Ticks; 
     } 

     public void display(Object a) 
     { 
      Console.WriteLine("{0}", a); 
     } 
    } 

    class Generics_Samle<T> 
    {    
     public Generics_Samle() 
     { 
      Console.WriteLine("Generics_Sample Class"); 
     } 

     public long getTicks() 
     { 
      return DateTime.Now.Ticks; 
     } 

     public void display(T a) 
     { 
      Console.WriteLine("{0}", a); 
     } 
    } 

    static void Main(string[] args) 
    {    
     long ticks_initial, ticks_final, diff_generics, diff_object; 
     Object_Sample OS = new Object_Sample(); 
     Generics_Samle<int> GS = new Generics_Samle<int>(); 

     //Generic Sample 
     ticks_initial = 0; 
     ticks_final = 0; 
     ticks_initial = GS.getTicks(); 

     for (int i = 0; i < 50000; i++) 
     { 
      GS.display(i); 
     } 
     ticks_final = GS.getTicks(); 
     diff_generics = ticks_final - ticks_initial; 

     //Object Sample 
     ticks_initial = 0; 
     ticks_final = 0; 
     ticks_initial = OS.getTicks(); 

     for (int j = 0; j < 50000; j++) 
     { 
      OS.display(j); 
     } 

     ticks_final = OS.getTicks(); 
     diff_object = ticks_final - ticks_initial; 

     Console.WriteLine("\nPerformance of Generics {0}", diff_generics); 
     Console.WriteLine("Performance of Object {0}", diff_object); 

     Console.ReadKey(); 
    } 
} 
+3

आपको अपने सवालों के जवाब स्वीकार करना चाहिए। – SLaks

+1

आपको 'स्टॉपवॉच' कक्षा का उपयोग करना चाहिए। – SLaks

+1

आपको उस उत्तर को स्वीकार करने के लिए अपने प्रत्येक प्रश्न के लिए दिए गए सर्वोत्तम उत्तर के बगल में खोखले चेक पर क्लिक करना चाहिए। – SLaks

उत्तर

5

आपका परीक्षण गलत है। यहाँ अपने तरीके हैं:

public void display(T a) 
{ 
    Console.WriteLine("{0}", a); // Console.WriteLine(string format, params object[] args) <- boxing is performed here 
} 

public void display(Object a)// <- boxing is performed here 
{ 
    Console.WriteLine("{0}", a); 
} 

तो, दोनों ही मामलों में आप मुक्केबाजी उपयोग कर रहे हैं।

public void add(long a) 
{ 
    Total += a; 
} 

public void display(Object a)// <- boxing is performed here 
{ 
    Total += (long) a;// <- unboxing is performed here 
} 
+0

के लिए मैंने यह कोड नहीं लिखा था, मैं सिर्फ यह जांचना चाहता था कि पुस्तक ने क्या किया है। आपकी टिप्पणी में आप कहते हैं कि "सार्वजनिक शून्य प्रदर्शन (ऑब्जेक्ट ए)" मुक्केबाजी यहां की जाती है। क्या आप इसे समझा सकते हैं, कृपया? मैं यहाँ कुछ भी कवर नहीं कर रहा हूँ? – Risho

+0

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

+0

तो इससे कोई फ़र्क नहीं पड़ता कि आप अपनी 'प्रदर्शन' विधि में किस प्रकार का इनपुट तर्क उपयोग कर रहे हैं, क्योंकि 'ऑब्जेक्ट' केस बॉक्सिंग में 'डिस्प्ले' विधि कॉल पर और 'कंसोल' पर 'जेनेरिक' में 'ऑब्जेक्ट' केस बॉक्सिंग में। विधि कॉल - लेकिन यह अभी भी हो रहा है। –

8

आप दोनों वर्गों यह घबराना को चलाने के लिए अनुमति देने के लिए समय से पहले एक अलग समय चलाना चाहिए:

धन्यवाद,

Risho

यहाँ कोड है।

+0

+1 यह मेरे लिए जिटर की तरह लगता है। –

+0

क्या आपने यह देखने के लिए अपनी प्रोफ़ाइल जांच की है कि स्वीकार्य उत्तर हैं या नहीं? –

+1

@ हेंक - मुझे लगता है कि कम से कम 13 प्रश्नों के बाद * एक * उत्तर स्वीकार्य होगा। लेकिन फिर, दर्शक की नजर में स्वीकार्यता है। –

3

यह तेज़ क्यों होगा? दोनों ints आदेश Console.WriteLine (स्ट्रिंग, वस्तु)

संपादित का उपयोग करने में बॉक्सिंग किया जाना चाहिए: ToString() ही मुक्केबाजी http://weblogs.asp.net/ngur/archive/2003/12/16/43856.aspx

कारण प्रतीत नहीं होता है तो आप Console.WriteLine का उपयोग करते हैं (क); जो Console.WriteLine (Int32) को कॉल करेगा जो मुझे लगता है (मुझे इसकी पुष्टि करने के लिए परावर्तक को देखने की आवश्यकता होगी)

+0

पाठ्य पुस्तक ने संकेत दिया कि जेनेरिक तेजी से हैं। – Risho

+0

अच्छी तरह से वे मुक्केबाजी और अनबॉक्सिंग को रोकने के लिए तेज़ होते हैं, लेकिन यह मामला – Kikaimaru

+0

नहीं है, मैं इसे समझने की कोशिश कर रहा हूं: मैं यहां तक ​​कि कंसोल नहीं कर रहा हूं, कंसोल। राइटलाइन करता है, जिसे मैं नहीं जानता था। यदि ऐसा है तो आप "मुक्केबाजी/अनबॉक्सिंग" के बिना परिणाम कैसे प्रदर्शित करते हैं? – Risho

9

ठीक है, पहली समस्या जो मैं देख सकता हूं वह यह है कि आप समय मापने के लिए डेटटाइम ऑब्जेक्ट का उपयोग कर रहे हैं आपके आवेदन में (बहुत छोटे अंतराल के लिए)।

आपको Stopwatch कक्षा का उपयोग करना चाहिए। बेंचमार्क कोड की कोशिश करते समय यह बेहतर परिशुद्धता प्रदान करता है।

दूसरी समस्या यह है कि आप जेआईटी (जस्ट-इन-टाइम संकलन) की अनुमति नहीं दे रहे हैं। आपके कोड पर पहली बार कॉल करने में काफी समय लगेगा क्योंकि इसे JIT'd होना है। उसके बाद, आपको अपने परिणाम मिलेंगे।

मैं समय कोड शुरू करने से पहले आपके कोड में एक कॉल कर दूंगा ताकि आप लूप के दौरान क्या हो रहा है, इसका सटीक विचार प्राप्त कर सकें।

+1

+1 'स्टॉपवॉच' –

3
  1. आपका समयबद्ध कोड एक Console.WriteLine() में शामिल हैं: बहुत बेहतर है, तो अपने वर्ग, उदाहरण के लिए, मान के कुल योग, जैसे ही गिना जाएगा होगा। उस समय 99.9 99 999% का समय लगेगा।
  2. आपकी धारणा है कि जेनेरिक इस स्थिति में तेज होगा गलत है। आपने गैर-जेनेरिक संग्रह कक्षाओं के बारे में एक टिप्पणी गलत व्याख्या की हो सकती है।
  3. यह परीक्षा में नहीं होगा।
संबंधित मुद्दे