उत्तर

37

इन दिनों (CF8 +) गति में अंतर नहीं है कि महान। हालांकि, structKeyExists वास्तव में थोड़ा तेज़ है। यहाँ पर क्यों।

जब आप isDefined का उपयोग करते हैं, तो आपके द्वारा पारित स्ट्रिंग को कई क्षेत्रों में एक प्रमुख नाम के रूप में खोजा जाता है। CF9, स्कोप की सूची, जाँच के क्रम में है के रूप में: (source)

  1. स्थानीय (समारोह स्थानीय, UDFs और केवल सीएफसी)
  2. तर्क
  3. थ्रेड स्थानीय (धागे के अंदर केवल)
  4. क्वेरी
  5. थ्रेड
  6. चर
  7. सीजीआई
  8. (नहीं एक सच्चे गुंजाइश, क्वेरी छोरों के भीतर चर के लिए लागू होता है)
  9. CFFile
  10. यूआरएल
  11. फार्म
  12. कुकी
  13. ग्राहक

भले ही आप isDefined (जैसे: if isDefined('variables.foo')) के साथ गुंजाइश नाम का उपयोग सूची अभी भी क्रम में जाँच की जाएगी; और यदि परिवर्तनीय local.variables.foo परिभाषित किया गया है, तो यह variables.foo से पहले मिलेगा।

दूसरी ओर, structKeyExists केवल उस कुंजी की खोज करता है जिसे आप कुंजी नाम के अस्तित्व के लिए पास करते हैं; इसलिए वहां बहुत कम जगहें दिखनी पड़ेगी।

अधिक स्पष्ट कोड (structKeyExists) का उपयोग करके, न केवल आप कुछ प्रदर्शन प्राप्त कर रहे हैं, लेकिन आपकी राय मेरी राय में अधिक पठनीय और रखरखाव योग्य है।

+0

बहुत अच्छा! यह देखना दिलचस्प है कि यह कार्यों को अलग-अलग कैसे संसाधित करता है। –

+0

मुझे यह भी लगता है कि कोल्डफ्यूजन को आपके द्वारा प्रदान की जाने वाली स्ट्रिंग पर एक eval चलाने की आवश्यकता है। StructKeyExists बहुत सारे काम से बचाता है। –

+1

हालांकि 'structKeyExists()' के साथ एक बड़ी समस्या है।यदि आप कोल्डफ्यूज़न के साथ एक JSON स्ट्रिंग को deserialize करते हैं और आपके पास 'myVal'' मान 'शून्य' के साथ एक संपत्ति है, तो 'structKeyExists (ऑब्जेक्ट, "myVal")' 'सत्य 'वापस कर देगा, जबकि' isDefined ("object.myVal") है नहीं होगा या दूसरे शब्दों में, यदि आप 'object.myVal' के साथ 'structKeyExists()' के साथ जांच करने के बाद संपत्ति तक पहुंचने का प्रयास करते हैं, तो आपको एक त्रुटि मिल जाएगी। – android

10

पढ़ने के लिए आसान है और सबसे अच्छा दिखाता है कि आप क्या कर रहे हैं।

दोनों के बीच का अंतर अविश्वसनीय रूप से छोटा है, और बहुत ही चिंताजनक नहीं है।

समय बर्बाद कोड के अनुकूलन जब तक आप एक साबित और repeatable परीक्षण का मामला जो सुस्ती को दर्शाता है नहीं है।

+1

+1। यह समझने के लिए निश्चित रूप से सार्थक है कि कैसे * दोनों कार्य संचालित होते हैं। लेकिन जब तक आपके पास प्रदर्शन समस्या नहीं है, तो पढ़ने योग्य कोड लिखना जो सही ढंग से व्यवहार करता है, कहीं अधिक महत्वपूर्ण आईएमओ है। – Leigh

+0

मैं पूरी तरह से सहमत हूं, लेकिन मैं अभी भी 'structKeyExists' का नियमित उपयोगकर्ता हूं। मुझे लगता है कि इसकी स्पष्ट प्रकृति सब कुछ क्रिस्टल स्पष्ट बनाती है, जहां 'परिभाषित' हमेशा नहीं होता है, जिसके परिणामस्वरूप महीनों या साल बाद पुराने कोड (और/या किसी और के कोड) पर वापस आने पर अधिक समय और सिरदर्द होता है। –

+0

हालांकि IsDefined() अधिक सहजता से नामित है, जो आपने अभी वर्णित किया है, अभी भी प्रदर्शन के बारे में समयपूर्व चिंताओं की तुलना में एक दूसरे को चुनने का एक बेहतर कारण है। कम से कम IMHO ;-) - लीघ 8 मिनट पहले – Leigh