2011-06-02 15 views
11

के साथ सबसे तेज़ संभव जावास्क्रिप्ट ऑब्जेक्ट क्रमबद्धता मुझे 1-100 मिश्रित प्रकार की गुणों के साथ मामूली जटिल वस्तुओं को क्रमबद्ध करने की आवश्यकता है।Google V8

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

एन्कोडिंग 10000 नमूना वस्तुओं

JSON:  1807mS 
BSON:  1687mS 
MessagePack: 2644mS (JS, modified for BinaryF) 

मैं परिमाण में वृद्धि का एक आदेश चाहते हैं; यह शेष प्रणाली पर हास्यास्पद रूप से बुरा प्रभाव पड़ रहा है।

बीएसओएन में जाने के लिए प्रेरणा का हिस्सा द्विआधारी डेटा को एन्कोड करने की आवश्यकता है, इसलिए JSON (अब) अनुपयुक्त है। और क्योंकि यह वस्तुओं में मौजूद बाइनरी डेटा को बस छोड़ देता है, यह उन बेंचमार्क में "धोखाधड़ी" है।

Profiled BSON प्रदर्शन गर्म स्पॉट

  • (अपरिहार्य?) UTF8 को UTF16 वी 8 जे एस तार के रूपांतरण।
  • malloc और स्ट्रिंग BSON पुस्तकालय

अंदर ऑप्स BSON एनकोडर मोंगो BSON पुस्तकालय पर आधारित है।

एक देशी वी 8 बाइनरी सीरियलाइज़र अद्भुत हो सकता है, फिर भी जेएसओएन मूल है और धारावाहिक करने के लिए तेज़ है, मुझे डर है कि यहां तक ​​कि जवाब भी प्रदान नहीं किया जा सकता है। शायद मेरी सबसे अच्छी शर्त बीएसओएन लाइब्रेरी से बिल्ली को अनुकूलित करना है या वी 8 से तार खींचने के लिए अपने स्वयं के प्लस आंकड़े को और अधिक प्रभावी तरीके से लिखना है। बीएसओएन को यूटीएफ 16 समर्थन जोड़ने की एक रणनीति हो सकती है।

तो मैं यहाँ विचारों के लिए हूं, और शायद एक सैनिटी चेक।

संपादित

जोड़ा गया MessagePack बेंचमार्क। बाइनरीएफ का उपयोग करने के लिए इसे मूल जेएस से संशोधित किया गया था।

सी ++ संदेशपैक लाइब्रेरी और सुधार प्रदान कर सकती है, मैं इसे बीएसओएन लाइब्रेरी से सीधे तुलना करने के लिए अलगाव में बेंचमार्क कर सकता हूं।

+0

हो सकता है कि आप –

+0

स्टोर करने के लिए आवश्यक डेटा के प्रकार को समझने में सहायता के लिए http://jsperf.com/ परीक्षण केस प्रदान कर सकें, बस मानक जेएस ऑब्जेक्ट्स: {param1: "name", param2: {paramA: 1, paramb: [0x0,0x1,0x2], paramC: }} 100 गुणों के साथ, मनमाने ढंग से घोंसला, जिनमें से कुछ में कॉमनजेएस बाइनरीएफ का उपयोग करके बाइट एरे होंगे। बाइनरीएफ और बीएसओएन धारावाहिक के बिना, किसी भी उपयोगी तुलना करना असंभव है। – hplbsh

+0

क्या आपके पास बीएसओएन, मैगपैक इत्यादि के लिए उपयोग किए गए किसी भी लिंक/संदर्भ हैं? –

उत्तर

5

क्रमबद्धता के लिए/अक्रमांकन protobuf सुंदर हरा मुश्किल है: [1,2,3] (3 तत्वों सरणी) MessagePack का उपयोग कर के रूप में इस 4 बाइट में धारावाहिक है। मुझे नहीं पता कि क्या आप परिवहन प्रोटोकॉल को बदल सकते हैं या नहीं। लेकिन अगर आप protobuf कर सकते हैं निश्चित रूप से माना जाना चाहिए।

Protocol Buffers versus JSON or BSON पर सभी उत्तरों को देखें।

स्वीकृत उत्तर thrift चुनता है। हालांकि यह protobuf से धीमा है। मुझे संदेह है कि इसे आसानी से उपयोग के लिए चुना गया था (जावा के साथ) गति नहीं। These Java benchmarks बहुत बता रहे हैं।
ध्यान दें

  • MongoDB-BSON 45042
  • Protobuf 6539
  • protostuff/Protobuf 3318

मानक जावा कर रहे हैं, मैं कल्पना करता कि आप protostuff कार्यान्वयन के पास गति को प्राप्त कर सकते हैं प्रोटोबफ का, यानी 13.5 गुना तेज। सबसे खराब मामला (यदि किसी कारण से जावा क्रमबद्धता के लिए बेहतर है) तो आप सादा unoptimized protobuf कार्यान्वयन को और भी खराब नहीं कर सकते हैं जो 6.8 गुना तेजी से चलता है।

+0

भी बंद नहीं है बेंचमार्क के लिए धन्यवाद। डेटा उपयोगकर्ता द्वारा जेनरेट किया गया है, इसलिए पीबी प्रोटोकॉल को अपने कुछ प्रदर्शन लाभों को कम करने वाले कुंजी/मूल्य जोड़े को ले जाने की आवश्यकता होगी, लेकिन मुझे उम्मीद है कि यह अभी भी बड़े मार्जिन द्वारा शीर्ष पर आ जाएगा। यह यूटीएफ 16 का समर्थन नहीं करता है, हालांकि उस प्रकार को जोड़ना मुश्किल नहीं है। – hplbsh

+0

मैं बीएसओएन के साथ फंस गया हूं और वृद्धिशील रूप से अनुकूलन के रूप में और कब है। लेकिन मैं कुछ बिंदु पर protobuf पर वापस आ सकता है। धन्यवाद। – hplbsh

3

MessagePack पर एक नज़र डालें। यह जेएसओएन के साथ संगत है। डॉक्स से:

फास्ट एंड कॉम्पैक्ट क्रमबद्धता

MessagePack एक द्विआधारी आधारित कुशल वस्तु क्रमबद्धता पुस्तकालय है। यह JS12 जैसी कई भाषाओं के बीच संरचित ऑब्जेक्ट्स का आदान-प्रदान करने में सक्षम बनाता है। लेकिन JSON के विपरीत, यह बहुत तेज़ और छोटा है।

ठेठ छोटे पूर्णांक (झंडे या त्रुटि कोड की तरह) केवल 1 बाइट, में सहेजा जाता है और ठेठ कम स्ट्रिंग केवल स्ट्रिंग खुद की लंबाई को छोड़कर 1 बाइट की जरूरत है।

+0

दिलचस्प, +1 –

+0

शानदार! निश्चित रूप से परीक्षण लायक है! मैं जेएस कार्यान्वयन पहले एक शॉट दे दूंगा। – hplbsh

+0

संदेशपैक बेंचमार्क जोड़ा गया। यह बहुत अच्छा है कि यह शुद्ध जेएस पर विचार कर रहा है ... – hplbsh

1

यदि आप डी-सीरियलाइजेशन गति पर अधिक रुचि रखते हैं, तो JBB (Javascript Binary Bundles) लाइब्रेरी पर एक नज़र डालें। यह बीएसओएन या मैगपैक से तेज है।

विकी से, पृष्ठ JBB vs BSON vs MsgPack:

...

  • JBB के बारे में 70% बाइनरी-JSON (BSON) की तुलना में तेजी और लगभग 30% डिकोडिंग गति पर MsgPack की तुलना में तेजी है, यहां तक ​​कि एक नकारात्मक परीक्षण-मामले (# 3) के साथ भी।
  • जेबीबी फाइलें बनाता है (यहां तक ​​कि उनके संपीड़ित संस्करण) बाइनरी-जेएसओएन (बीएसओएन) से लगभग 61% छोटे हैं और एमएसपीपीएक से लगभग 55% छोटे हैं।

...

दुर्भाग्य से, यह एक स्ट्रीमिंग प्रारूप नहीं है, जिसका अर्थ है कि आप चाहिए पूर्व प्रक्रिया आपका डेटा ऑफ़लाइन। हालांकि इसे स्ट्रीमिंग प्रारूप में बदलने के लिए एक योजना है (मील का पत्थर देखें)।

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