WP7

2011-02-23 22 views
5

पर JSON क्रमबद्धता प्रदर्शन समस्या मेरे पास एक .JSON फ़ाइल है जो लगभग है। आकार में 1.5 एमबी जिसमें लगभग 1500 JSON ऑब्जेक्ट्स हैं जिन्हें मैं अपने ऐप के स्टार्ट-अप पर डोमेन ऑब्जेक्ट्स में कनवर्ट करना चाहता हूं।WP7

वर्तमान में फोन पर मेरी प्रक्रिया (मेरे विकास पीसी पर नहीं) लगभग 23 सेकंड लगती है जो मेरे लिए बहुत धीमी है और मुझे वस्तुओं की सूची ApplicationSettings में लिखने के लिए मजबूर कर रही है ताकि मुझे हर बार ऐसा न करना पड़े ऐप लोड करता है (केवल पहले बंद), लेकिन यहां तक ​​कि लिखने के लिए 15-सेकंड सेकंड लेते हैं, और पढ़ने के लिए 16 सेकंड लगते हैं, जिनमें से सभी वास्तव में पर्याप्त नहीं हैं।

मेरे पास बहुत सी धारावाहिक अनुभव नहीं है और मैं इसे करने के लिए सबसे तेज़ तरीका नहीं जानता हूं।

वर्तमान में, मैं नामस्थान का उपयोग DataContract और DataMember दृष्टिकोण के साथ कर रहा हूं।

इस प्रकार के डेटा लोडिंग के साथ प्रदर्शन पर कोई विचार?

+1

पहला सवाल आपको ** स्टार्टअप पर सभी 1500 ऑब्जेक्ट्स को बदलने के लिए ** ** की आवश्यकता होगी? –

+0

हाँ :) दुर्भाग्यवश – Mark

+0

की आवश्यकता है http://servicestack.net/benchmarks/ –

उत्तर

4

मुझे Json.NET लाइब्रेरी अधिक प्रदर्शन करने वाला और मानक जेसन सीरियलाइज़र बेहतर विकल्प रखने के लिए मिला।

मेरे ऐप में एक प्रदर्शन समस्या का सामना करना पड़ा था कि मेरे डोमेन ऑब्जेक्ट्स ने आईओटी थ्रेड पर ईवेंट को प्रेषित करने के लिए कोड के साथ INOTifyProperty को लागू किया था। चूंकि deserialization कोड उन गुणों को आबादी के बाद से मैं बहुत सारे धागे marshalling कर रहा था कि वहाँ होने की जरूरत नहीं थी। Deserialization के दौरान अधिसूचनाओं काटना काफी हद तक प्रदर्शन में वृद्धि हुई।

अद्यतन: मैं कैलिबर्न माइक्रो का उपयोग कर रहा था जिसमें संपत्ति चेंजबेस पर एक संपत्ति है जो संपत्ति बदलती अधिसूचनाओं को बंद कर सकती है।

[OnDeserializing] 
public void OnDeserializing(StreamingContext context) 
{ 
    IsNotifying = false; 
} 

[OnDeserialized] 
public void OnDeserialized(StreamingContext context) 
{ 
    IsNotifying = true; 
} 
+0

ऐसा लगता है कि यह अब तक एक अच्छी नौकरी कर रहा है :) – Mark

+0

जब आप deserialization के दौरान अधिसूचनाओं को काटते हैं तो आप क्या बदलते हैं, इसके बारे में @ निगेल सैम्पसन क्या आप थोड़ा और विस्तार प्रदान कर सकते हैं? मुझे लगता है कि मैं वर्तमान में इस में दौड़ रहा हूं ... – GotDibbs

+0

मेरे समाधान –

0

एप्लिकेशन सेटिंग्स में संग्रहीत/पुनर्स्थापित करना क्रमशः सीरियलाइजेशन को शामिल करने जा रहा है (यह सुनिश्चित है कि यह एक्सएमएल है) इसलिए मुझे नहीं लगता कि आप कभी भी देख रहे 16 सेकंड से अधिक तेज हो रहे हैं।

चारों ओर डेटा की मात्रा को स्थानांतरित करना तेजी से नहीं चल रहा है इससे कोई फर्क नहीं पड़ता कि deerializer कितना अच्छा है। मेरी सिफारिश यह देखना होगा कि आप इतनी सारी वस्तुओं को क्यों संग्रहीत कर रहे हैं। यदि आप वस्तुओं के सेट को कम नहीं कर सकते हैं तो आपको उन्हें लॉजिकल समूहों में तोड़ने के लिए स्टोर करने की आवश्यकता है ताकि आप आगे की बजाय मांग पर लोड कर सकें।

+0

हाँ सहमत हैं, मुझे लगता है कि JSON.NET अब तक अच्छा दिख रहा है – Mark

1

मुक्त EQATEC Profiler WP7 के लिए के साथ अपने ऐप की रूपरेखा का प्रयास करें: मैं उसके बाद निम्न गयी। वास्तविक मुद्दा कुछ पूरी तरह अप्रत्याशित और ठीक करने में आसान हो सकता है, जैसे INotifyPropertyChanged-example Nigel का उल्लेख है।

+0

के साथ अपडेट किया गया बहुत बढ़िया सुझाव, मैंने उस समस्या को खोजने के लिए प्रोफाइलर का उपयोग किया। –

+0

बढ़िया! प्रोफाइलर पर लीड डेवलपर के रूप में मैं वास्तव में खुश हूं कि आपके लिए अभी तक एक और अप्रत्याशित बोतल खोजने के लिए उपयोगी रहा है :-) –

0

क्या आपने कई छोटी फ़ाइलों का उपयोग करने की कोशिश की है और [डी] समानांतर में क्रमबद्ध करने के लिए यह देखने के लिए कि क्या यह तेज़ होगा?

1

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

मैं अभी भी 1500 वस्तुओं की आवश्यकता के बारे में सोच रहा हूं। क्या आपको वास्तव में पूरे ऑब्जेक्ट की 1500 की आवश्यकता है, और यदि ऐसा है, तो क्यों - आखिरकार फोन उपयोगकर्ता को कुछ दिखा रहा है और कोई भी उपयोगकर्ता 1500 बिट्स की जानकारी को एक बार में संसाधित नहीं कर सकता है। वे केवल प्रस्तुत की गई जानकारी को संसाधित कर सकते हैं, नहीं? तो क्या ऑब्जेक्ट के संभावित भाग हैं जिन्हें आप दिखा सकते हैं, और बाद में अन्य हिस्सों को लोड करने की प्रतीक्षा कर सकते हैं? उदाहरण के लिए, यदि मेरे पास 2000 संपर्क हैं तो मैं 2000 संपर्क कभी लोड नहीं करूंगा।मैं 2000 नाम लोड कर सकता हूं, उपयोगकर्ता को नामों को फ़िल्टर/सॉर्ट करने दें, और फिर जब वे नाम चुनते हैं तो संपर्क लोड करें।

मैं एक फ़ाइल के रूप में पृथक भंडारण के लिए क्रमबद्ध करने का सुझाव दूंगा। अंतर्निहित JSON serializer डिस्क पर सबसे छोटा पदचिह्न है और काफी अच्छा प्रदर्शन करता है।

1

Here क्रमबद्धता के बारे में एक पोस्ट है। बाइनरी या जेसन.Net का प्रयोग करें।