2010-05-14 7 views
11

मैंने किसी को सलाह दी है कि मुझे बार-बार String.Length पर कॉल करने से बचें, क्योंकि हर बार जब मैंने इसे कॉल किया था तो इसे फिर से गणना की गई थी। मैंने माना था कि String.Length ओ (1) समय में भाग गया। String.Length उससे अधिक जटिल है?.NET System.String.Length संपत्ति का समय क्या है?

+4

मुझे विश्वास है कि आप .NET 'System.String.Length' संपत्ति के बारे में पूछ रहे हैं, क्योंकि सी # में ऐसी कोई संपत्ति नहीं है। –

+0

संबंधित: http://stackoverflow.com/questions/151472/what-is-the-difference-between-string-empty-and/151481 –

+1

भी संबंधित: http://stackoverflow.com/questions/717801/is- स्ट्रिंग-लम्बाई-इन-सी-नेट-इंस्टेंट-वेरिएबल – jball

उत्तर

20

यह बुरी सलाह है - String.Length वास्तव में ओ (1) है। यह सी

में strlen की तरह नहीं है वैसे यह the docs में गारंटी जहाँ तक मैं बता सकता हूँ नहीं है, लेकिन तार की अचल स्थिति यह एक बहुत मूर्खतापूर्ण बात नहीं हे बनाने के लिए बनाता है (1)। (और न सिर्फ हे (1), लेकिन एक बहुत ही तेजी निरंतर समय भी।)

सच कहूं अगर कोई सलाह की इस प्रकार की दे रहा है, मैं थोड़ा अधिक के बारे में अन्य सलाह वे भी प्रदान कर सकता है उलझन बन जाएगा ...

+0

मैं वास्तव में पहले संदर्भ को देखता हूं, कहता हूं कि कॉल लाखों पुनरावृत्तियों के साथ एक लूप में अनावश्यक रूप से है ... कुल मिलाकर, उन मामलों में एक अच्छी बात है कि संपत्ति को कॉल न करें अगर यह पूरी तरह से समान है पाश। – eglasius

+6

@ फ्रेडडी: मैं असहमत हूं - यदि यह सबसे आसान कोड है और यह एक बहुत ही सरल संपत्ति का मूल्यांकन कर रहा है जो कि रेखांकित किया जा रहा है, तो मैं एक अस्थायी स्थानीय चर लागू करने के बजाय ऐसा करना चाहता हूं। कुछ मामलों में (सरणी लंबाई) जेआईटी एक अस्थायी स्थानीय की तुलना में संपत्ति का उपयोग करके * बेहतर * करता है ... –

+0

@ फ्र्रेडी रियोस, मुझे नहीं पता, लेकिन यह आश्चर्यचकित नहीं होगा कि संकलक जानता है कि तार अपरिवर्तनीय हैं और अनुकूलित करते हैं तदनुसार कोड। मुझे लगता है कि, एक कंपाइलर के लिए एक आसान अनुकूलन होना चाहिए। – tster

2

याद रखें कि तार अपरिवर्तनीय हैं। System.String.Length कभी नहीं बदलता है।

+9

यह विधि का उत्तर नहीं देती है कि विधि O (1) समय लेती है - उदाहरण के लिए विधि अभी भी ओ (एन) हो सकती है। –

+0

@Daniel: इस तथ्य, साथ ही सामान्य ज्ञान, साथ ही तथ्य यह है कि "n" लोग कोड की समीक्षा कर रहे हैं, एन> 1000 के लिए, और यह मानते हुए कि उनमें से 1% का अर्थ है कि भगवान ने एक कॉलेज फ्रेशमैन दिया, बहुत अधिक _does_ साबित कि संपत्ति निरंतर समय में चलती है। कोई गणित आवश्यक नहीं है। –

4

स्ट्रिंग। लम्बाई ओ (1) है। लोग आपको लूप में कॉल न करने का कारण बताते हैं क्योंकि यह एक संपत्ति का उपयोग है, जो एक विधि कॉल के समान है। हकीकत में एक अतिरिक्त विधि कॉल शायद ही कभी कोई महत्वपूर्ण अंतर बनाता है।

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

0

आंतरिक टिप्पणियों के अनुसार, स्ट्रिंग। लम्बाई संपत्ति एक ही निर्देश है जो लूप के लिए नहीं चलाता है। इसलिए, यह एक ओ (1) ऑपरेशन है।

1

नहीं, यह पुन: गणना नहीं करता है। स्ट्रिंग प्रकार अपरिवर्तनीय है।

.net ढांचे डिज़ाइन दिशानिर्देशों प्रति, क्योंकि इससे अधिक लेने के लिए, एक वस्तु का एक गुण बहुत ज्यादा स्थिर और प्रकृति में गैर अस्थिर है कि संपत्ति के रूप में तैयार किया जा जाएगा। क्या संपत्ति एक अस्थिर प्रकृति की होनी चाहिए जिसे प्रत्येक कॉल पर पुनर्मूल्यांकन की आवश्यकता हो, इसे विधि के रूप में उपलब्ध कराया जाएगा।

आप यह नियम ले सकते हैं कि आप यह जांचने का प्रयास करते हैं कि कोई संपत्ति आपके ध्यान आकर्षित करने के लिए पर्याप्त प्रसंस्करण चक्र लेती है या नहीं।

2

जैसा कि अन्य ने स्ट्रिंग कहा है। लम्बाई एक निरंतर संपत्ति है। यदि आप वास्तव में प्रदर्शन (या महत्वपूर्ण पुनरावृत्तियों के बारे में) परवाह करते हैं, तो आप एक बार एक स्थानीय पूर्णांक चर के लिए अपना मान असाइन कर सकते हैं, और कई बार पढ़ सकते हैं (लूप में, आदि)। यह ऑप्टिमाइज़र को इस मान को एक सीपीयू रजिस्टर में आवंटित करने का एक बेहतर मौका देगा। किसी संपत्ति को एक्सेस करना एक स्टैक वैरिएबल या रजिस्टर से अधिक महंगा ऑपरेशन है।

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