2016-01-19 5 views
5

संक्षेप में: क्या यह तेज़/सस्ता है? क्या तेजी से पहुंच के लिए स्मृति में NSUserDefaults से एक मूल्य संग्रहीत करने के लिए समझ में आता है?आईओएस पर NSUserDefaults तक पहुंच सस्ता माना जाता है?

लंबा: कहें, मेरे पास एनएसयूसर डीफॉल्ट से संग्रहीत और पढ़ने के लिए महत्वपूर्ण संख्या में मूल्य हैं; उन मूल्यों को अक्सर पढ़ने (पढ़ने) की आवश्यकता के साथ।

नीचे स्निपेट में, मैं एक निजी संग्रहीत संपत्ति शुरू करता हूं, और इसे संबंधित NSUserDefaults मान के साथ समन्वयित करता हूं - इसलिए जब मुझे इसे पढ़ने की आवश्यकता होती है, तो मैं संपत्ति पढ़ता हूं।

यदि डिफ़ॉल्ट से सीधे पढ़ना वास्तव में तेज़ है, तो मैं निजी संपत्ति को स्पष्ट रूप से हटा दूंगा। लेकिन मुझे इसके बारे में अनिश्चितता है। क्या यह तेज़ है? भविष्य पाठकों के लिए

private var _loggedIn = NSUserDefaults.standardUserDefaults().boolForKey("loggedIn") 
public var loggedIn: Bool { 
    get { 
     return _loggedIn 
    } 
    set { 
     _loggedIn = newValue 
     NSUserDefaults.standardUserDefaults().setBool(newValue, forKey: "loggedIn") 
     NSUserDefaults.standardUserDefaults().synchronize() 
    } 
} 

स्पष्टीकरण: प्रश्न के बारे में पढ़ रही है, लेखन/सिंक्रनाइज़ करना है, जो (के रूप में जवाब में बताया) है तेजी से और न ही सस्ते में नहीं नहीं।

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

.. वास्तव में, अब मैं इसे देखता हूं, मैं संग्रहीत संपत्ति को स्निपेट में रखता हूं, यह तर्क अखंडता प्रदान करेगा (जब तक अन्य स्थानों से पहुंच गेटटर के माध्यम से होती है, और सीधे से नहीं userDefaults)। तो मैं यहां भी synchronizing से बच सकता हूं।

+3

एक्सेसिंग सस्ता है, अगर आप इसे जल्दी से कर रहे हैं तो सिंक्रनाइज़िंग –

उत्तर

5

पढ़ना सस्ता है। जगह पर एक उदार कैशिंग है और राम में सबकुछ होता है। उत्परिवर्तन अपेक्षाकृत सस्ता है, लेकिन सिस्टम को नियमित अंतराल पर गैर-अस्थिर स्मृति (फ़्लैश पर एक .plist फ़ाइल) को सामग्री को स्टोर करना होगा।

स्पष्ट सिंक्रनाइज़िंग सस्ता नहीं है। यह समय और अधिक ऊर्जा खाता है।

तो पढ़ने के लिए यह ठीक है, लेकिन बहुत से लिखने के साथ मैं अभी भी एक अलग कंटेनर और धारावाहिक में आवश्यकतानुसार ऐसा करता हूं।

+1

यही कारण है कि 'सिंक्रनाइज़' विधि को 'एनएसयूसर डीफॉल्ट' को प्रत्येक एकल लेखन को कुछ असाधारण मामलों तक नहीं कहा जाना चाहिए। ओएस उन लोगों को आपके लिए डिस्क पर लिख देगा। – GoRoS

+0

हां, आपको लगभग सिंक्रनाइज़() 'मैन्युअल रूप से कॉल करने की आवश्यकता नहीं है। –

+1

@ जोनशियर मैं खुद एक बहुत ही अजीब परिस्थितियों में भाग गया हूं, जो सिंक्रनाइज़ नहीं कर रहा था (यह आईओएस 6 मुझे विश्वास था)। मैंने कारण निकालने से पहले काफी समय बिताया - बेवकूफ, मुझे पता है, लेकिन फिर भी। तब से मैं डिफ़ॉल्ट रूप से लेखन के साथ रक्षात्मक रहा हूं। – user1244109

2

यह महत्वपूर्ण प्रदर्शन प्रभाव होने की संभावना नहीं है, लेकिन आप निष्पादन प्रभाव नगण्य सुनिश्चित करने के लिए स्वयं को उपकरण का उपयोग करके प्रोफ़ाइल कर सकते हैं।

1

मैंने इंस्ट्रूमेंट्स के साथ कुछ प्रदर्शन परीक्षण किए हैं क्योंकि @ मिपाडी ने पिछले साल सुझाव दिया है और मेरा निष्कर्ष कोई महत्वपूर्ण अंतर नहीं था।

जैसा कि मैंने ऊपर एक टिप्पणी में बताया है, यह पता लगाना बहुत महत्वपूर्ण है कि NSUserDefaults लिखते हैं कि हम सीधे काम करना चाहते हैं। बस उन विशेष मामलों में synchronize विधि का उपयोग करें, अन्यथा बेहतर प्रदर्शन प्राप्त करने के लिए उस काम को संभालने के लिए आईओएस छोड़ दें।

+0

कोई उल्लेखनीय प्रदर्शन प्रभाव नहीं हो सकता है क्योंकि सिस्टम प्रभावी ढंग से कैशिंग और लिखने के लिए सहकारी है, लेकिन फिर भी नियमित I/O गतिविधि I/O की तुलना में अधिक ऊर्जा का उपभोग कर सकती है। – Mirek

+0

@ मिरेक अंत में आपको स्मृति या I/O के बीच प्रतिबद्धता चुननी है क्योंकि प्रत्येक के पास इसके सकारात्मक और नकारात्मक हैं। क्या होगा यदि हम उस जानकारी को डिस्क पर सहेजे बिना कैश करते हैं और ऐप अचानक उपयोगकर्ता द्वारा मारा जाता है? जानकारी खो जाएगी। दूसरी तरफ, यदि हम एक अलग कंटेनर का उपयोग करते हैं और इसे डिफ़ॉल्ट रूप से क्रमबद्ध करते हैं, तो इसमें अधिक डेटा होगा और ओएस के सहवासित लेखन के समान ही होगा। – GoRoS

0

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

लेकिन साथ ही यह सवाल की जाँच: How often are NSUserDefaults synchronised?

एक दिलचस्प विस्तार है कि उपयोगकर्ता चूक जब आपके आवेदन को समाप्त कर देता लिखा जाएगा है।कोई भी प्रयोग कर सकता है कि क्या होता है यदि आपका प्रोग्राम NSUserdefaults को बदलने के बाद सही हो जाता है; अगर वह "समाप्ति" के रूप में गिना जाता है।

+0

क्रैश 'NSUserDefaults' के लिए समाप्ति के रूप में नहीं गिना जाता है। हालांकि, अगर आपका ऐप क्रैश खराब अभ्यास होता है तो सिंक्रनाइज़() को जोड़ना। आपको बस यह सुनिश्चित करना चाहिए कि आप ऐप क्रैश नहीं करते हैं। –

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