2012-06-06 14 views
8

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

+0

कृपया निम्नलिखित पोस्ट करने के लिए लग रही है, यह कहना है JSON [अतः LNK] [1] [1]: http://stackoverflow.com/questions/7818926/data-efficiency- रिटर्न-इन-जेसन-या-एक्सएमएल –

+1

पूछने के बजाय सबसे तेज़ क्या है, क्यों नहीं पूछें कि सबसे उपयुक्त क्या है? एक्सएमएल विन्यास फाइल .NET दुनिया में एक मान्यता प्राप्त मानक हैं। मैं इस उदाहरण में (कम से कम आश्चर्य] [http://en.wikipedia.org/wiki/Principle_of_least_astonishment) के लिए जाऊंगा (इसलिए, एक्सएमएल)। –

+3

मैं सभी उत्तरों से असहमत हूं कि जेएसओएन मनुष्यों द्वारा कम पठनीय है। बिल्कुल इसके विपरीत। जे जावास्क्रिप्ट के लिए खड़ा है। जेएसओएन भी एक चीज से पहले, इसे हाथ से टाइप करने और मानव आंखों द्वारा पढ़ने के लिए डिज़ाइन किया गया था। एक्सएमएल वही नहीं कह सकता है, और यह बहुत कम पठनीय है। लेकिन किसी भी मामले में, सर्वोत्तम प्रदर्शन खोजने के लिए आसान है। बस JSON और XML दोनों में अपनी कॉन्फ़िगरेशन लिखें, फिर एक फ़ंक्शन लिखें जो प्रत्येक को क्रमबद्ध करता है। फिर स्टॉपवॉच क्लास उपाय का उपयोग करके प्रत्येक के 1000 पुनरावृत्तियों को करने में कितना समय लगता है। अब आप जानते हैं कि कौन सा बेहतर प्रदर्शन करता है। – Wedge

उत्तर

16

अनुमान लगा की खैर बजाय, मैं इस सवाल का जवाब है। यहाँ परीक्षण कार्यक्रम है:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string xmlConfig = ""; 
     string jsonConfig = ""; 

     Config myConfig = new Config() 
     { 
      value = "My String Value", 
      DateStamp = DateTime.Today, 
      counter = 42, 
      Id = Guid.NewGuid() 
     }; 

     // Make both strings 
     DataContractSerializer xmlSerializer = new DataContractSerializer(typeof(Config)); 
     using (MemoryStream xmlStream = new MemoryStream()) 
     { 
      xmlSerializer.WriteObject(xmlStream, myConfig); 
      xmlConfig = Encoding.UTF8.GetString(xmlStream.ToArray()); 
     } 

     DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Config)); 
     using (MemoryStream jsonStream = new MemoryStream()) 
     { 
      jsonSerializer.WriteObject(jsonStream, myConfig); 
      jsonConfig = Encoding.UTF8.GetString(jsonStream.ToArray()); 
     } 

     // Test Single 
     var XmlSingleTimer = Stopwatch.StartNew(); 
     SerializeXML(xmlConfig, 1); 
     XmlSingleTimer.Stop(); 

     var JsonSingleTimer = Stopwatch.StartNew(); 
     SerializeJSON(jsonConfig, 1); 
     JsonSingleTimer.Stop(); 

     // Test 1000 
     var XmlTimer = Stopwatch.StartNew(); 
     SerializeXML(xmlConfig, 1000); 
     XmlTimer.Stop(); 

     var JsonTimer = Stopwatch.StartNew(); 
     SerializeJSON(jsonConfig, 1000); 
     JsonTimer.Stop(); 

     // Test 10000 
     var XmlTimer2 = Stopwatch.StartNew(); 
     SerializeXML(xmlConfig, 10000); 
     XmlTimer2.Stop(); 

     var JsonTimer2 = Stopwatch.StartNew(); 
      SerializeJSON(jsonConfig, 10000); 
     JsonTimer2.Stop(); 

     Console.WriteLine(String.Format("XML Serialization Single: {0}ms", XmlSingleTimer.Elapsed.TotalMilliseconds)); 
     Console.WriteLine(String.Format("JSON Serialization Single: {0}ms", JsonSingleTimer.Elapsed.TotalMilliseconds)); 
     Console.WriteLine(); 
     Console.WriteLine(String.Format("XML Serialization 1000: {0}ms", XmlTimer.Elapsed.TotalMilliseconds)); 
     Console.WriteLine(String.Format("JSON Serialization 1000: {0}ms ", JsonTimer.Elapsed.TotalMilliseconds)); 
     Console.WriteLine(); 
     Console.WriteLine(String.Format("XML Serialization 10000: {0}ms ", XmlTimer2.ElapsedMilliseconds)); 
     Console.WriteLine(String.Format("JSON Serialization 10000: {0}ms ", JsonTimer2.ElapsedMilliseconds)); 
    } 

    public static void SerializeXML(string xml, int iterations) 
    { 
     DataContractSerializer xmlSerializer = new DataContractSerializer(typeof(Config)); 
     for (int i = 0; i < iterations; i++) 
     { 
      using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xml))) 
      { 
       Config serialized = (Config)xmlSerializer.ReadObject(stream); 
      } 
     } 
    } 

    public static void SerializeJSON(string json, int iterations) 
    { 
     DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Config)); 
     for (int i = 0; i < iterations; i++) 
     { 
      using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(json))) 
      { 
       Config serialized = (Config)jsonSerializer.ReadObject(stream); 
      } 
     } 
    } 
} 

public class Config 
{ 
    public string value; 
    public DateTime DateStamp; 
    public int counter; 
    public Guid Id; 
} 

और यह मापा उत्पादन होता है:

XML Serialization Single: 2.3764ms 
JSON Serialization Single: 2.1432ms 

XML Serialization 1000: 13.7754ms 
JSON Serialization 1000: 13.747ms 

XML Serialization 10000: 100ms 
JSON Serialization 10000: 134ms 

JSON लगातार 1 यात्रा के बाद सिर्फ एक छोटा सा तेजी से बाहर आया था। 1000 पुनरावृत्तियों के बाद वास्तव में कोई फर्क नहीं पड़ता। 10000 पुनरावृत्तियों के बाद, एक्सएमएल स्पष्ट रूप से तेज़ था।

इस बिंदु पर मैं समझा नहीं सकता कि जेएसओएन एक समय में तेज क्यों होगा, लेकिन दोहराए जाने पर एक्सएमएल तेज होगा। शायद पुस्तकालय में कैशिंग या कुछ फैंसी के कारण। आप देख सकते हैं कि जेसनसेरियलाइज़र रैखिक रूप से स्केल किया गया है, 10 के क्रम से पुनरावृत्तियों में वृद्धि हुई है। 10 के क्रम से विलुप्त समय में वृद्धि हुई है। XmlSerializer अलग-अलग व्यवहार करता है, हालांकि इसका प्रदर्शन रैखिक तरीके से स्केल नहीं होता है।

मैंने इसे कई बार दोहराया और लगातार एक ही परिणाम प्राप्त हुए।

तो, सबक यह है कि यदि आप एक बार एक ही वस्तु को पार्स कर रहे हैं, तो JSON थोड़ा बेहतर होगा। लेकिन यदि आप बार-बार वस्तुओं को पार्स कर रहे हैं, तो एक्सएमएल बेहतर प्रदर्शन कर सकता है। हालांकि, मैंने परीक्षण नहीं किया है कि क्या होगा यदि वस्तु मान प्रत्येक पुनरावृत्ति के साथ बदल जाए, जिससे कोई फर्क पड़ सकता है।

यह भी ध्यान दें, मैं देशी रनटाइम का उपयोग कर रहा हूं। यहां सरलीकरण पुस्तकालय का उपयोग कर रहा हूं। अन्य पुस्तकालयों से अलग-अलग परिणाम मिलेंगे।

संपादित करें: मैंने हर बार स्ट्रिंग कहलाए जाने पर एक नया ग्रिड और यादृच्छिक Int उत्पन्न करते समय यह कोशिश की। इससे एकल या 10000 पुनरावृत्ति परीक्षणों में कोई फर्क नहीं पड़ता। लेकिन 1000 पुनरावृत्तियों के लिए, JSON लगभग 1ms तेज था। तो ऐसा लगता है कि एक्सएमएल सीरिएलाइज़र वास्तव में मूल्यों को कैश कर रहा है।

+6

भयानक होगा यदि JSON-serialization के लिए 'Newtonsoft.Json' का उपयोग किया गया था .. :) – TryingToImprove

+3

मैंने सभी कोड दिए, आप इसे इच्छित किसी भी धारावाहिक का उपयोग करके आजमा सकते हैं;) – Wedge

1

क्रमबद्ध करने की लागत मोटे तौर पर वही होगी। यह एक उल्लेखनीय अंतर होने की संभावना नहीं है। उस प्रारूप का प्रयोग करें जो आपके उपयोगकर्ता सबसे अधिक आरामदायक संशोधित महसूस करेंगे (क्योंकि यह एक कॉन्फ़िगरेशन फ़ाइल है)।

वास्तविक प्रदर्शन अंतर तब हो सकता है जब आपको किसी नेटवर्क पर JSON या XML भेजने की आवश्यकता हो। फिर, प्रदर्शन इस बात पर निर्भर करता है कि आप कितनी चीजें भेज रहे हैं, और चूंकि जेएसओएन आम तौर पर एक्सएमएल से अधिक संक्षिप्त है, यह आम तौर पर नेटवर्क पर बेहतर प्रदर्शन करेगा।

+2

बेशक संपीड़न सक्षम नहीं है या वे बाइनरी एक्सएमएल का उपयोग करते हैं। ओपी में बहुत अधिक अस्थिर धारणाएं मेरी पसंद के लिए सवाल करती हैं। –

2

जेसन एक्सएमएल की तुलना में मनुष्यों द्वारा कभी-कभी कम पठनीय हो सकता है, लेकिन जेसन द्वारा उत्पन्न फ़ाइल का आकार छोटा है। इसलिए यदि आपको नेटवर्क पर फ़ाइल भेजने की आवश्यकता है, तो जेसन बेहतर choise हो सकता है, या यदि आप इसे पढ़ने में सक्षम होना चाहते हैं, तो एक्सएमएल बेहतर है। एक और अच्छी बात यह है कि .NET 4 में आपके पास गतिशील कीवर्ड है, और आप अपने जेसन को सीधे सी # ऑब्जेक्ट में परिवर्तित कर सकते हैं।

+1

मुझे जेसन को एक्सएमएल की तुलना में बहुत अधिक पठनीय लगता है! – Arijoon

+0

@ एरिजून वाह ... 5 साल पुरानी टिप्पणी :) वैसे भी, मैंने हाल ही में वेब ऐप्स पर काम किया है, और अब मुझे यह और अधिक पठनीय लगता है क्योंकि मैं इसके प्रति आदी हूं और संपादक इन दिनों स्मार्ट हैं (आप जेसन सेक्शन आदि को संकुचित कर सकते हैं) । 1 मामले को छोड़कर: जब आपके पास कोई मान होता है जिसमें टेक्स्ट में नई लाइनें होती हैं। आप वास्तव में अपनी जेसन टेक्स्ट वैल्यू को नई लाइन रखने के लिए प्रारूपित नहीं कर सकते हैं, आपको \ n जोड़ना होगा। इसलिए, आप एक बड़ी रेखा देखते हैं जिसमें \ n इसमें शामिल है। –

6

जब मैं .NET अनुप्रयोग में कॉन्फ़िगरेशन की तलाश करता हूं, तो मुझे कहीं भी एक XML फ़ाइल को MyApp.exe.config कहा जाता है।

principle of least surprise मैं JSON पर XML क्रमांकन एहसान होगा पर बने रहना। एक अतिरिक्त लाभ है कि एक्सएमएल स्वरूपित विन्यास को Configuration API के साथ काम करने के लिए अनुकूलित किया जा सकता है। आदि मंच नास्तिक, सभ्य पारसर्स, पाठ आधारित,

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

2
मेरी राय में

सब है निर्भर आप करते हैं और कैसे की जरूरत है क्या आप को लागू करना चाहते हैं, यहाँ एक अच्छा JSON और एक्सएमएल की तुलना लेख है। क्लाइंट साइड में संपीड़न और deserialization मैं JSON का चयन करें।

गुड लक।

http://dotnet.dzone.com/articles/json-vs-xml-net-developer%E2%80%99s

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