2009-07-07 22 views
8

के लिए एक्सएमएल बनाम बाइनरी प्रदर्शन मैं एक कॉम्पैक्ट फ्रेमवर्क आवेदन पर काम कर रहा हूं और प्रदर्शन को बढ़ावा देने की जरूरत है। ऐप वर्तमान में एक्सएमएल को ऑब्जेक्ट्स को क्रमबद्ध करके और डेटाबेस में संग्रहीत करके ऑफ़लाइन काम करता है। एक प्रोफाइलिंग टूल का उपयोग करके मैं देख सकता था कि यह ऐप धीमा कर रहा था, यह काफी बड़ा ओवरहेड था। मैंने सोचा कि अगर मैं एक द्विआधारी क्रमबद्धता में स्विच करता हूं तो प्रदर्शन बढ़ेगा, लेकिन क्योंकि यह कॉम्पैक्ट फ्रेमवर्क में समर्थित नहीं है, मैंने प्रोटोबफ-नेट को देखा। क्रमबद्धता तेज लगती है, लेकिन deserialization बहुत धीमी है और ऐप serializing से अधिक deserializing कर रहा है।सीरियलाइजेशन/Deserialization

बाइनरी सीरियलाइजेशन तेज होना चाहिए और यदि ऐसा है तो मैं प्रदर्शन को तेज करने के लिए क्या कर सकता हूं? यहाँ कैसे मैं दोनों एक्सएमएल और बाइनरी उपयोग कर रहा हूँ का एक टुकड़ा है:

एक्सएमएल क्रमबद्धता:

public string Serialize(T obj) 
{ 
    UTF8Encoding encoding = new UTF8Encoding(); 
    XmlSerializer serializer = new XmlSerializer(typeof(T)); 
    MemoryStream stream = new MemoryStream(); 
    XmlTextWriter writer = new XmlTextWriter(stream, Encoding.UTF8); 
    serializer.Serialize(stream, obj); 
    stream = (MemoryStream)writer.BaseStream; 
    return encoding.GetString(stream.ToArray(), 0, Convert.ToInt32(stream.Length)); 
} 
public T Deserialize(string xml) 
{ 
    UTF8Encoding encoding = new UTF8Encoding(); 
    XmlSerializer serializer = new XmlSerializer(typeof(T)); 
    MemoryStream stream = new MemoryStream(encoding.GetBytes(xml));    
    return (T)serializer.Deserialize(stream); 
} 

Protobuf शुद्ध बाइनरी क्रमांकन:

public byte[] Serialize(T obj) 
{ 
    byte[] raw; 
    using (MemoryStream memoryStream = new MemoryStream()) 
    { 
    Serializer.Serialize(memoryStream, obj); 
    raw = memoryStream.ToArray(); 
    } 

    return raw;    
} 

public T Deserialize(byte[] serializedType) 
{ 
    T obj; 
    using (MemoryStream memoryStream = new MemoryStream(serializedType)) 
    { 
    obj = Serializer.Deserialize<T>(memoryStream); 
    } 
    return obj; 
} 
+0

मैं रेड-गेट एएनटीएस प्रोफाइलर का उपयोग करने का सुझाव देने जा रहा था लेकिन यह कॉम्पैक्ट फ्रेमवर्क (Google "लाल-गेट चींटियों प्रोफाइलर कॉम्पैक्ट" पर खोज नहीं करता है) – Kane

उत्तर

1

दिलचस्प ... विचार:

  • सीएफ का कौन सा संस्करण यह है; 2.0? 3.5? आप क्षेत्रों या गुण व्याख्या कर रहे हैं विशेष रूप से, सीएफ 3.5 Delegate.CreateDelegate की अनुमति देता है कि सीएफ 2.0
  • में कर सकते हैं की तुलना में बहुत तेजी से गुण का उपयोग करने के लिए Protobuf शुद्ध है? फिर, सीएफ में प्रतिबिंब अनुकूलन सीमित हैं; आप ही एकमात्र विकल्प मैं उपलब्ध है FieldInfo.SetValue

अन्य चीजें हैं जो बस सीएफ में मौजूद नहीं है की एक संख्या हैं गुण साथ सीएफ 3.5 में beter प्रदर्शन प्राप्त कर सकते हैं, एक क्षेत्र के साथ के रूप में, तो यह है कुछ स्थानों में समझौता करने के लिए। अत्यधिक जटिल मॉडल के लिए known issue with the generics limitations of CF भी है। एक फिक्स चल रहा है, लेकिन यह बड़ा परिवर्तन है, और "थोड़ी देर" ले रहा है।

जानकारी के लिए, नियमित रूप से (पूर्ण) नेट are here (XmlSerializer और Protobuf शुद्ध सहित) विभिन्न स्वरूपों की तुलना के बारे में कुछ दिखाती है।

+0

मैं CF2.0 का उपयोग कर रहा हूं, और मेरे पास है उन वस्तुओं के गुणों में गुणों को जोड़ा गया जिन्हें मुझे क्रमबद्ध करने की आवश्यकता है। – Charlie

+0

क्या यह सीएफ 3.5 (सीएफ 3.5 बाइनरी के साथ) में यह देखने के लिए संभव है कि यह ठीक करे या नहीं? –

+0

ठीक है, मैंने अभी सीएफ 3.5 पर अपना परीक्षण चलाया है और सीएफ 2 से महत्वपूर्ण प्रदर्शन बढ़ता है; बाइनरी दोनों क्रमिकरण और deserialization दोनों के लिए बहुत तेज प्रदर्शन करता है। दुर्भाग्यवश मैं सीएफ 2 से जुड़ा हुआ हूं, हालांकि चीजों पर पुनर्विचार करना पड़ सकता है। – Charlie

0

क्या आपने अपनी कक्षाओं के लिए कस्टम सीरियलाइजेशन कक्षाएं बनाने की कोशिश की है? XmlSerializer का उपयोग करने के बजाय जो एक सामान्य उद्देश्य serializer है (यह रनटाइम पर कक्षाओं का एक गुच्छा बनाता है)। ऐसा करने के लिए एक उपकरण है (sgen)। आप इसे अपनी निर्माण प्रक्रिया के दौरान चलाते हैं और यह एक कस्टम असेंबली उत्पन्न करता है जिसका उपयोग XmlSerializer की गति में किया जा सकता है।

यदि आपके पास विजुअल स्टूडियो है, तो विकल्प आपके प्रोजेक्ट के गुणों के बिल्ड टैब के अंतर्गत उपलब्ध है।

0

प्रदर्शन ऑब्जेक्ट को क्रमबद्ध करने या डेटाबेस में लिखने में प्रदर्शन मारा जाता है? चूंकि उन्हें लिखने से शायद कुछ प्रकार की धीमी भंडारण हो रही है, मैं कल्पना करता हूं कि यह धारावाहिक चरण की तुलना में एक बड़ा पेर्फ हिट होगा।

ध्यान रखें कि मार्क ग्रेवल द्वारा पोस्ट किए गए परफ माप 1,000,000 से अधिक पुनरावृत्तियों के प्रदर्शन का परीक्षण कर रहे हैं।

आप उन्हें किस प्रकार का डेटाबेस संग्रहीत कर रहे हैं? क्या वस्तुओं को स्मृति में सीधे या भंडारण में क्रमबद्ध किया गया है? उन्हें डीबी में कैसे भेजा जा रहा है? वस्तुएं कितनी बड़ी हैं? जब कोई अपडेट किया जाता है, तो क्या आप सभी ऑब्जेक्ट्स को डेटाबेस में भेजते हैं, या सिर्फ वह बदलता है? क्या आप स्मृति में कुछ भी कैशिंग कर रहे हैं, या हर बार भंडारण से फिर से पढ़ रहे हैं?

+0

ऑब्जेक्ट्स को SQLCe डेटाबेस में संग्रहीत किया जा रहा है, लेकिन मैं स्पष्ट रूप से देख सकता हूं कि क्रमबद्धता और deserialization प्रदर्शन हिट है, डेटाबेस इंटरैक्शन नहीं। सामग्री भी स्मृति में कैश किया जा रहा है, लेकिन एक डीबी में सामान स्टोर करने की जरूरत है ताकि इसे ऐप के सत्रों के बीच पुनः प्राप्त किया जा सके। – Charlie

5

मैं इस पर खुद को सही करने जा रहा हूं, मार्क ग्रेवल ने पहले पुनरावृत्ति को मॉडल को बल्ब करने का ओवरहेड किया है, इसलिए मैंने एक्सएमएल और बाइनरी दोनों के लिए सीरियलाइजेशन और deserialization के 1000 पुनरावृत्तियों के औसत लेने के कुछ परीक्षण किए हैं । मैंने पहले कॉम्पैक्ट फ्रेमवर्क डीएलएल के v2 के साथ अपने परीक्षणों की कोशिश की, और फिर v3.5 DLL के साथ। यहाँ मैं क्या मिला है, समय एमएस में है:

.NET 2.0 
================================ XML ====== Binary === 
Serialization 1st Iteration  3236  5508 
Deserialization 1st Iteration 1501  318 
Serialization Average   9.826  5.525 
Deserialization Average   5.525  0.771 

.NET 3.5 
================================ XML ====== Binary === 
Serialization 1st Iteration  3307  5598 
Deserialization 1st Iteration 1386  200 
Serialization Average   10.923  5.605 
Deserialization Average   5.605  0.279 
0

एक्सएमएल अक्सर संसाधित करने के लिए धीमी है और अंतरिक्ष के एक बहुत लेता है। इस से निपटने के लिए कई अलग-अलग प्रयास किए गए हैं, और आज सबसे लोकप्रिय लगता है कि Open Packaging Convention के साथ, बस एक gzip फ़ाइल में बहुत कुछ छोड़ना है।

W3C ने जीजीआईपी दृष्टिकोण इष्टतम से कम होने के लिए दिखाया है, और वे और विभिन्न other groups ट्रांसमिशन के लिए तेजी से प्रसंस्करण और संपीड़न के लिए उपयुक्त बेहतर बाइनरी क्रमिकरण पर काम कर रहे हैं।

3

आपकी विधि में मुख्य व्यय XmlSerializer वर्ग की वास्तविक पीढ़ी है। धारावाहिक बनाना एक समय लेने वाली प्रक्रिया है जिसे आपको केवल प्रत्येक ऑब्जेक्ट प्रकार के लिए करना चाहिए। धारावाहिकों को कैशिंग करने का प्रयास करें और देखें कि क्या यह प्रदर्शन में सुधार करता है या नहीं।

इस सलाह के बाद मैंने अपने ऐप में एक बड़ा प्रदर्शन सुधार देखा जो मुझे एक्सएमएल क्रमबद्धता का उपयोग करने के लिए जारी रखने की अनुमति देता है।

उम्मीद है कि इससे मदद मिलती है।