ऑब्जेक्ट प्रकार का परीक्षण करने के लिए सबसे कुशल तरीका

मेरे पास DataTable में तारों के रूप में संग्रहीत मान हैं जहां प्रत्येक मान वास्तव में int , double , या string का प्रतिनिधित्व कर सकता है। (वे सभी बाहरी डेटा स्रोत से आयात प्रक्रिया के दौरान तारों में परिवर्तित हो गए थे)। मुझे परीक्षण करने और देखने की ज़रूरत है कि प्रत्येक मूल्य वास्तव में किस प्रकार का है।

आवेदन के लिए और अधिक कुशल क्या है (या कोई व्यावहारिक अंतर नहीं है)?

  1. Try to convert to int (and then double). If conversion works, the return true. If an exception is thrown, return false.
  2. Regular expressions designed to match the pattern of an int or double
  3. Some other method?
0
जोड़ा संपादित
विचारों: 1

5 उत्तर

मैं कहूंगा, इस तरह के माइक्रो प्रदर्शन के बारे में चिंता मत करो। काम करने के लिए कुछ हासिल करना बेहतर होता है, और फिर इसे यथासंभव स्पष्ट और संक्षिप्त और पढ़ने के लिए आसान बनाता है। सबसे बुरी चीज जो आप कर सकते हैं वह प्रदर्शन की एक महत्वपूर्ण मात्रा के लिए पठनीयता को त्याग देती है।

अंत में, प्रदर्शन समस्याओं से निपटने का सबसे अच्छा तरीका उनको बचाने के लिए है जब आपके पास डेटा है जो इंगित करता है कि वास्तविक प्रदर्शन समस्या है ... अन्यथा आप माइक्रो-ऑप्टिमाइज़िंग में काफी समय व्यतीत करेंगे और वास्तव में उच्च रखरखाव लागत का कारण बनेंगे बाद में।

अगर आपको यह पता चलता है कि यह पार्सिंग स्थिति वास्तव में आपके आवेदन में बाधा है, तो समस्या का समाधान करने का सबसे तेज़ तरीका यह जानने का प्रयास करने का समय है। मुझे लगता है कि जेफ (और कई अन्य) ने इस तरह की चीज के बारे में बहुत कुछ लिखा है।

0
जोड़ा

मैं व्यक्तिगत रूप से int.tryparse का उपयोग करता हूं, फिर double.tryparse। उन तरीकों पर प्रदर्शन काफी तेज है। वे दोनों एक बूलियन लौटते हैं। यदि दोनों विफल हो जाते हैं तो आपके पास एक स्ट्रिंग है, इस पर आपने अपना डेटा कैसे परिभाषित किया है।

0
जोड़ा

डबल का उपयोग करेंगे। ट्राईपर्स, इसका प्रदर्शन लाभ है।

0
जोड़ा

आप ऑप्टिमाइज़ेशन के साथ संकलित करते हैं या नहीं, इस पर निर्भर करते हुए आपको अलग-अलग तरीकों के लिए अलग-अलग परिणाम मिलेंगे। आपके पास मूल रूप से कुछ विकल्प हैं:

object o;

//checking with is
o is int

//check type
o.GetType() != typeof( int )

//cast and catch exception
try{ int j = (int) o; } 
catch {}

//use the tryparse
int.TryParse( Convert.ToString( o ), out j )

आप आसानी से एक कंसोल ऐप सेट कर सकते हैं जो इन 10,000 बार में से प्रत्येक का प्रयास करता है और प्रत्येक के लिए अवधि देता है (परीक्षण जब ओ int है और जब यह कुछ और होता है)।

try-catch विधि सबसे तेज़ है यदि ऑब्जेक्ट एक int रखता है, और यदि तक यह धीमा नहीं है (यहां तक ​​कि GetType से भी धीमा)। यदि आपके पास स्ट्रिंग है तो int.TryParse बहुत तेज़ है, लेकिन यदि आपके पास अज्ञात ऑब्जेक्ट है तो यह धीमा है।

दिलचस्प बात यह है कि .NET 3.5 और ऑप्टिमाइज़ेशन o int चेक पर चालू होते हैं, उसी समय try-catch के रूप में एक ही समय लेता है जब ओ वास्तव में एक int है। o int है केवल थोड़ा धीमा है यदि वास्तव में कुछ और है।

परेशान करने से FxCop चेतावनी फेंक देगा यदि आप कुछ ऐसा करते हैं:

if( o is int )
    int j = (int) o;

लेकिन मुझे लगता है कि यह FxCop में एक बग है - यह नहीं जानता कि int एक मान प्रकार है और आपको इसके बजाय o int का उपयोग करने की सलाह देता है।

यदि आपका इनपुट हमेशा एक स्ट्रिंग int.TryParse सर्वोत्तम होता है, अन्यथा है ऑपरेटर सबसे तेज़ है।

जैसा कि आपके पास एक स्ट्रिंग है, मैं देखता हूं कि आपको यह जानने की ज़रूरत है कि यह एक डबल की बजाय एक int है। यदि int.TryParse तब गुजरता है तो double.TryParse होगा ताकि आप चेक की आधा संख्या कर सकें - या तो डबल या स्ट्रिंग लौटाएं और जब आप int की अपेक्षा करते हैं तो युगल फर्श करें।

0
जोड़ा

आपके पास जो समस्या है वह यह है कि ऐसी स्थितियां हो सकती हैं जहां उत्तर तीनों प्रकार हो सकता है।

3 एक int, एक डबल या एक स्ट्रिंग हो सकता है!

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

0
जोड़ा
अंतिम लक्ष्य ऑब्जेक्ट के लिए सबसे विशिष्ट डेटा प्रकार निर्धारित करने का प्रयास करना था। 3 एक int होगा। 3.5 एक डबल होगा। "तीन" एक स्ट्रिंग होगी। अंततः मैंने एक फ़ंक्शन को एक साथ रखा जिसने ऑब्जेक्ट का एक गुच्छा करने की कोशिश की। ट्राईपर्स कॉल तब तक कॉल करता है जब तक यह निर्धारित नहीं कर सके कि "सर्वश्रेष्ठ फिट" डेटा प्रकार क्या था।
जोड़ा लेखक Yaakov Ellis, स्रोत