2011-03-14 11 views
12

में जेएसओएन बनाम एक्सएमएल पार्सिंग गति हम एक ऐसे एप्लिकेशन बना रहे हैं जो बहुत सारे एक्सएमएल पार्सिंग का उपयोग करता है और मैंने सोचा कि शायद जेएसओएन का उपयोग करना है, क्योंकि हम जेएसओएन का एक्सएमएल के विकल्प के रूप में उपयोग कर सकते हैं।डेल्फी

मुझे परीक्षण करने की आवश्यकता है कि कौन सी तेज JSON या XML है, लेकिन पहले यहां एक राय पूछने के लिए सोचा।

जावास्क्रिप्ट में JSON मूल है और यह तेज़ है। XML को पार्स करने से निश्चित रूप से तेज़। लेकिन डेल्फी में ऐसा करने के लिए कोई मूल वर्ग नहीं है।

तो मेरा सवाल है - जो एक्सएमएल या जेएसओएन पार्सर लाइब्रेरी का उपयोग करते हुए डेल्फी में तेज़ है? या वे गति में बराबर हैं?

और यह तेजी से तो जो आप पसंद करते हैं - तो Delphi Web Utils, JSON Delphi Library या JSON Toolkit

उत्तर

11

एक अच्छी तरह से लिखा पार्सर, XML और JSON के साथ और अधिक या कम एक ही समय होगा। आपके पास धीमी JSON पार्सर हो सकती है, और एक तेज़ एक्सएमएल पार्सर हो सकता है।

शायद एक्सएमएल के लिए थोड़ा धीमा है क्योंकि वाक्यविन्यास जेएसओएन की तुलना में अधिक जटिल है।

लेकिन बाधा ज्यादातर हार्ड ड्राइव से पढ़ रही है, सामग्री को पार्स नहीं कर रही है।

हम अपने ORM की क्लाइंट/सर्वर के लिए JSON इस्तेमाल किया कई कारणों से (लेकिन आप दूसरों मिल जाएगा, मैं यहाँ ट्रोल नहीं करना चाहते, बस हमारे छोटे से प्रयोग से बात):

  • एक्सएमएल की तरह, यह सरल डेटा संरचनाओं और सहयोगी सरणी (वस्तुओं कहा जाता है) का प्रतिनिधित्व करने के लिए एक पाठ आधारित, मानव-पठनीय प्रारूप है;
  • पढ़ने के लिए आसान है (मनुष्यों और मशीनों दोनों के लिए), कार्यान्वित करने के लिए तेज़, और आमतौर पर एक्सएमएल की तुलना में आकार में छोटे;
  • यह डेटा कैशिंग के लिए एक बहुत ही कुशल प्रारूप है;
  • इसका लेआउट अलग-अलग शून्य-समाप्त यूटीएफ -8 स्ट्रिंग्स में जगह पर फिर से लिखा जा सकता है, लगभग कोई बर्बाद जगह नहीं: इस सुविधा का उपयोग टेबल जेएसओएन को टेबल परिणामों के टेक्स्ट रूपांतरण में चमकाने के लिए किया जाता है, बिना मेमोरी आवंटन और न ही डेटा कॉपी ;
  • यह जावास्क्रिप्ट भाषा द्वारा मूल रूप से समर्थित है, जो इसे किसी भी AJAX (यानी वेब 2.0) एप्लिकेशन में एक पूर्ण क्रमबद्धता प्रारूप बनाता है;
  • JSON प्रारूप एक प्रसिद्ध और सरल आरएफसी में निर्दिष्ट है;
  • जेएसओएन और हमारे ओआरएम दोनों के लिए डिफ़ॉल्ट टेक्स्ट एन्कोडिंग यूटीएफ -8 है, जो पूर्ण यूनिकोड वर्णमाला को संग्रहीत और संचारित करने की अनुमति देता है;
  • यह .NET Framework 3.5 के बाद से विंडोज संचार फाउंडेशन (डब्ल्यूसीएफ) में बनाए गए एएसपी.NET AJAX सेवाओं द्वारा उपयोग किया जाने वाला डिफ़ॉल्ट डेटा प्रारूप है; तो यह माइक्रोसॉफ्ट आधिकारिक "तैयार" है;
  • बाइनरी ब्लॉब ट्रांसमिशन के लिए, एक्सएमएल में कोई सीडीएटीए नहीं है। इसलिए हम बस JSON स्ट्रिंग के अंदर बाइनरी डेटा को हेक्साडेसिमल या बेस 64 (कम स्थान का उपयोग करते हैं) के रूप में एन्कोड करते हैं।

पार्सिंग गति के बारे में, आप हमारे in-place parser and JSON writer from SQLite3 results पर एक नज़र डाल सकते हैं। यह गति के लिए बहुत अनुकूलित था, और तेज़ यह है। हमने संग्रह सहित, किसी भी टीपीर्सिस्टेंट के लिए एक सरल लेकिन efficient JSON serialization लिखा था। हम बस a dynamic array JSON serializer जोड़ते हैं, जो भी बहुत तेज़ है।

अतिरिक्त ध्यान दें:

सभी उन पारसर्स एक आप का उल्लेख से अलग है क्योंकि वे JSON सामग्री पार्स और इनपुट बफर अंदर पाठ के रूप में स्वरूपित: कोई स्मृति आवंटन पार्स करने के दौरान किए गए है, इसलिए यह होना चाहिए अन्य समाधानों से तेज हो। टेक्स्ट सामग्री अनदेखी है, फ़ील्ड # 0 समाप्त हो गई हैं, और पाठ की शुरुआत में एक सूचक की गणना की जाती है। तो किसी मान को एक्सेस करने के लिए, आप डेटा प्राप्त करने के लिए केवल पॉइंटर का उपयोग करते हैं। यह आमतौर पर किसी भी समय JSON सामग्री के कुछ एमबी का विश्लेषण करता है।

JSON parser embedded in DWS पर भी एक नज़र डालें। लेखक ने दावा किया कि यह तेज़ था। लेकिन अभी भी प्रत्येक ऑब्जेक्ट के लिए एक मेमोरी ब्लॉक आवंटित किया गया है।

+0

हमारे इन-प्लेस जेएसओएन पार्सिंग, और डोम/एसएक्स एक्सएमएल पार्सर तकनीकों के बारे में, आप http://blog.synopse.info/post/2011/06/02/Fast-JSON-parsing –

+0

पर एक नज़र डाल सकते हैं @ Bouchez: क्या आपका JSON पार्सर दूसरों के उपयोग के लिए उपलब्ध है? यदि हां, तो क्या आप इसे डाउनलोड करने के लिए लिंक प्रदान कर सकते हैं? धन्यवाद – costa

+0

पार्सर हमारे [SynCommons.pas इकाई] (http://synopse.info/fossil/finfo?name=SynCommons.pas) में निम्न स्तर के कार्यों के सेट के रूप में उपलब्ध है। किसी भी प्रकार की जेएसओएन सामग्री को किसी पेड़ में परिवर्तित करने में सक्षम उच्च स्तर की कक्षाएं नहीं हैं, क्योंकि हम मोरमोट में ऐसी मेमोरी और सीपीयू उपभोग प्रक्रिया से बचने की कोशिश करते हैं, और हम साधारण वस्तुओं या सरणी पर भरोसा करते हैं। लेकिन आपके पास शक्तिशाली JSONToObject() और ObjectToJSON() फ़ंक्शन हैं। –