2009-11-12 5 views
33

मैं समझना चाहता हूं कि the protocol buffers solution for .NETMarc Gravell द्वारा विकसित क्यों तेज़ है।प्रोटोबफ-नेट सम्मानजनक प्रदर्शन कैसे प्राप्त करता है?

मैं समझ सकता हूं कि मूल Google समाधान ने अपना प्रदर्शन कैसे प्राप्त किया: यह ऑब्जेक्ट क्रमबद्धता के लिए अनुकूलित कोड को पूर्व-उत्पन्न करता है; मैंने हाथ से कुछ क्रमबद्धता लिखी है और पता है कि अगर आप प्रतिबिंब से बचें तो इस तरह से बहुत तेज़ कोड लिखना संभव है। लेकिन मार्क की लाइब्रेरी एक रनटाइम समाधान है जो विशेषताओं का उपयोग करती है और किसी जेनरेट कोड का उत्पादन नहीं करती है। तो यह कैसे काम करता है ?

+4

आप स्रोत पढ़ने की कोशिश की? या सीधे मार्क पूछना भी? – Lazarus

+0

मैंने कोशिश की और यहां तक ​​कि कुछ विचार भी हैं, लेकिन अगर कोई त्वरित जवाब दे सकता है तो यह अच्छा होगा – MichaelT

+2

मैं खुशी से इस बारे में घंटों तक बात करूंगा ;- लेकिन मुझे काम खत्म होने तक इंतजार करना होगा ... –

उत्तर

41

प्रोटोबफ-नेट एक रणनीति पैटर्न का उपयोग करता है; आवश्यकतानुसार (केवल एक बार प्रति प्रकार) यह प्रकारों को देखने के लिए प्रतिबिंब का उपयोग करता है, और धारावाहिकों (एक सामान्य इंटरफेस के आधार पर) का एक सेट बनाता है जो इसे धारावाहिक और deserialize करने के लिए उपयोग कर सकते हैं - उपयोग में यह बस के माध्यम से कदम है धारावाहिकों के ज्ञात सेट।

के अंदर, यह सदस्यों से बात करते समय प्रतिबिंब के समझदार उपयोग करने की कोशिश करता है; यह गुणों से बात करने के लिए Delegate.CreateDelegate का उपयोग करता है, और DynamicMethod (और कस्टम आईएल) फ़ील्ड से बात करने के लिए (जब संभव हो, यह लक्ष्य ढांचे पर निर्भर करता है) का उपयोग करता है। इसका मतलब यह है कि यह हमेशा प्रतिनिधि प्रकारों से बात करता है, केवल DynamicInvoke (जो बहुत धीमा है) के बजाय।

  • स्थानीय byte[] बफरिंग (इनपुट/आउटपुट धाराओं का)
  • निश्चित-आकार का उपयोग करते हुए:

    पागल हो रहा बिना, कोड कुछ अनुकूलन के मामले में (यकीनन पठनीयता की कीमत पर) है सरणी (सूचियों आदि के बजाए); शायद बहुत ज्यादा

  • जेनरिक का उपयोग कर मुक्केबाजी
  • कई तोड़ मरोड़/twiddles/आदि बाइनरी प्रसंस्करण के आसपास से बचने के लिए लूप

मसा में, मैं मैं जेनरिक मुद्दे पर एक गलती की है लगता है; जटिलता का मतलब है कि जेनिक्स को सिस्टम bent it out of shape in a few places में मजबूर करना, और सक्रिय रूप से कुछ प्रमुख समस्याएं (जटिल मॉडल के लिए) on compact framework का कारण बनती है।

मैं (केवल मेरे सिर में) इस refactor करने के लिए गैर -generic इंटरफेस का उपयोग कर, और बदले के लिए (उपयुक्त चौखटे के लिए) ILGenerator के अधिक उपयोग करने के कुछ डिजाइन (मेरी पहली पसंद Expression हो गया होता, लेकिन वह बलों एक उच्च ढांचा संस्करण)। समस्या यह है कि, यह काम करने के लिए काफी समय ले रहा है, और हाल ही में I've been pretty swamped तक।

हाल ही में मैंने start spending some time on protobuf-net again में कामयाब रहा है, इसलिए उम्मीद है कि मैं अनुरोधों का बैकलॉग साफ़ कर दूंगा और जल्द ही इसे शुरू कर दूंगा। यह प्रतिबिंब की तुलना में मॉडल अन्य के साथ काम करने का मेरा इरादा भी है (यानी तार मैपिंग को अलग से वर्णित करना)।


और किसी भी उत्पन्न कोड

मैं भी स्पष्ट करना चाहिए कि आप उत्पन्न कोड उपयोग करना चाहते हैं दो (वैकल्पिक) codegen मार्गों देखते हैं कि उत्पादन नहीं करता है; protogen.exe, या VS add-in, कोड पीढ़ी को .proto फ़ाइल से अनुमति दें।लेकिन यह की आवश्यकता नहीं है - यह मुख्य रूप से उपयोगी है यदि आपके पास मौजूदा .proto फ़ाइल है, या अनुबंध-प्रथम विकास के लिए किसी अन्य भाषा (सी ++ आदि) के साथ अंतःक्रिया करने का इरादा है।

-3

इसका प्रदर्शन बहुत अच्छा है!

आप द्वारा मुझ http://maxondev.com/serialization-performance-comparison-c-net-formats-frameworks-xmldatacontractserializer-xmlserializer-binaryformatter-json-newtonsoft-servicestack-text/

इस तुलना बड़े और छोटे डेटा के नमूने और विभिन्न स्वरूपों में शामिल किया Protobuf सहित विभिन्न प्रारूपों के बीच एक व्यापक तुलना देख सकते हैं।

मेरी पोस्ट में परीक्षण में से एक enter image description here

+0

सवाल यह था कि प्रदर्शन कैसे पूरा किया गया था, यह नहीं कि यह कितना सक्षम है। –