2009-05-04 20 views
13

enumस्ट्रिंग प्रकारों की तुलना में तेज़ी से/अधिक कुशल प्रकारों को कुंजीपटल कुंजी के रूप में उपयोग करते समय उपयोग किया जाता है?जो तेज़/अधिक कुशल है: शब्दकोश <string, object> या शब्दकोश <enum,object>?

IDictionary<string,object> or IDictionary<enum,object> 

वास्तव में, कौन सा डेटा प्रकार एक शब्दकोश कुंजी के रूप में सबसे उपयुक्त है और क्यों? सादगी

struct MyKeys 
{ 
    public string Incomplete = "IN"; 
    public string Submitted = "SU"; 
    public string Processing="PR"; 
    public string Completed = "CO"; 
    public string Closed = "CL"; 
} 

और

enum MyKeys 
{ 
    Incomplete, 
    Submitted, 
    Processing, 
    Completed, 
    Closed 
} 

ऊपर से कौन सा बेहतर होगा अगर एक शब्दकोश में कुंजी के रूप में इस्तेमाल के लिए केवल 5 गुण:

पर विचार निम्नलिखित: नोट!

+0

क्या सी # के पास जावा के एनमैप के बराबर है? –

उत्तर

13

निश्चित रूप से enum संस्करण बेहतर है (जब दोनों लागू होते हैं और निश्चित रूप से समझ में आते हैं)। न केवल प्रदर्शन के लिए (यह बेहतर या बदतर हो सकता है, रशैक की बहुत अच्छी टिप्पणी देखें) क्योंकि यह संकलित समय की जांच की गई है और क्लीनर कोड में परिणाम हैं।

आप Dictionary<int, object> का उपयोग करने और int रों को enum कुंजी कास्टिंग या एक कस्टम comparer निर्दिष्ट द्वारा comparer मुद्दे को दरकिनार कर सकते हैं।

+9

प्रदर्शन-वार यह वास्तव में सच नहीं हो सकता है (आश्चर्यजनक रूप से) - http://ayende.com/Blog/archive/2009/02/21/dictionaryltenumtgt-puzzler.aspx – Rashack

+1

आप हमेशा अपना खुद का तुलनाकर्ता निर्दिष्ट कर सकते हैं। यह शब्दकोश या enum के साथ कोई मुद्दा नहीं है, लेकिन तुलना –

2

क्लीनर और निसर कोड प्राप्त करने के लिए enum का उपयोग करें, लेकिन यदि आप प्रदर्शन से संबंधित हैं तो एक कस्टम तुलनाकर्ता प्रदान करना याद रखें: http://ayende.com/Blog/archive/2009/02/21/dictionaryltenumtgt-puzzler.aspx

5

मुझे लगता है कि आपको शुद्धता पर ध्यान केंद्रित करके शुरू करना चाहिए। यह आपके कार्यक्रम के भीतर होने वाले मामूली प्रदर्शन अंतरों के बीच न्यूनतम अंतर से कहीं अधिक महत्वपूर्ण है। इस मामले में मैं आपके प्रकार के उचित प्रतिनिधित्व पर ध्यान केंद्रित करूंगा (enum सबसे अच्छा प्रतीत होता है)। फिर बाद में आपके आवेदन पर प्रोफाइल करें और यदि कोई समस्या है, तो केवल तभी आपको इसे ठीक करना चाहिए।

प्रक्रिया में बाद में कोड बनाना तेजी से एक सीधी आगे की प्रक्रिया है। स्कोलिमा प्रदान किया गया लिंक ले लो। यदि आपने एनम चुना है, तो यह आपके आवेदन में संभावित प्रदर्शन समस्या को हटाने के लिए लगभग 10 मिनट का फ़िक्स होगा। मैं यहाँ शब्द क्षमता पर जोर देना चाहता हूं। यह निश्चित रूप से NHibernate के लिए एक समस्या थी, लेकिन यह आपके कार्यक्रम के लिए एक समस्या होगी या नहीं, इसका उपयोग पूरी तरह से किया जाएगा।

दूसरी ओर, प्रक्रिया में बाद में कोड को और अधिक सही बनाना अधिक कठिन होता है। एक बड़ी पर्याप्त समस्या में आप पाएंगे कि लोग पिछले बुरे व्यवहार के साइड इफेक्ट्स पर निर्भरता लेना शुरू करते हैं। यह चुनौतीपूर्ण अन्य घटकों को तोड़ने के बिना कोड को सही कर सकता है।

1

लागू मई नहीं लेकिन ...

ध्यान रखें कि enums हैं compiled सभी विधानसभाओं जो enum संदर्भ अगर यह बदल दिया जाता है की पुनः तैनाती कारण हो सकता है जो के रूप में constants। (यानी निरंतर उन सभी असेंबली के संकलन समय में हार्डकोड किया जाता है जो इसका उपयोग करते हैं)।

+0

तो स्ट्रिंग संस्करण होगा इसलिए मैं आपके बिंदु का पालन नहीं करता। – Seabizkit

-1

मुझे लगता है कि enum संस्करण तेज है। हुड के तहत शब्दकोश हैशकोड द्वारा सबकुछ संदर्भित करता है। मेरा अनुमान है कि एक स्ट्रिंग के लिए हैशकोड उत्पन्न करना धीमा है। हालांकि, यह शायद लापरवाही से धीमा है, और स्ट्रिंग तुलना की तरह कुछ भी निश्चित रूप से तेज़ है। मैं उन अन्य पोस्टरों से सहमत हूं जिन्होंने कहा कि एक enum क्लीनर है।

संबंधित मुद्दे