سؤال

أريد أن أفهم لماذا الحل المخازن المؤقتة للبروتوكول .NET طورت بواسطة مارك جرافيل هو بأسرع ما هو عليه.

أستطيع أن أفهم كيف حقق حل Google الأصلي أدائها: إنه يولد مسبقا رمز محسن لاستسلسل الكائن؛ لقد كتبت بعض التسلسل باليد وتعرف أنه من الممكن كتابة رمز سريع جدا بهذه الطريقة إذا تجنب الانعكاس. لكن مكتبة مارك هي حل وقت التشغيل يستخدم السمات ولا ينتج أي رمز ولوج عليه. فكيف يعمل ؟

هل كانت مفيدة؟

المحلول

يستخدم Protobuf-Net نمط استراتيجية؛ حسب الحاجة (مرة واحدة فقط لكل نوع)، يستخدم التفكير للنظر في الأنواع، ويبني مجموعة من Serializers (استنادا إلى واجهة شائعة) يمكنها استخدامها لتسلسل وتغاضي - هكذا عندما تكون قيد الاستعمال انها مجرد خطوة من خلال مجموعة المعروفة من Serializers.

في داخل أنه يحاول تقديم استخدام معقول للانعكاس عند التحدث إلى الأعضاء؛ ويستخدم ذلك Delegate.CreateDelegate للتحدث إلى العقارات، و DynamicMethod (والعرف IL) للتحدث إلى الحقول (عندما يكون ذلك ممكنا؛ ذلك يعتمد على الإطار الهدف). هذا يعني أنه يتحدث دائما إلى معروف أنواع المندوبين، وليس فقط DynamicInvoke (وهو بطيء جدا).

دون المجنون، يحتوي الرمز على بعض الأمثل (يمكن القول على حساب قابلية القراءة) من حيث:

  • محلي byte[] التخزين المؤقت (من تدفقات الإدخال / الإخراج)
  • باستخدام صفائف ذات الحجم الثابت (بدلا من القوائم وما إلى ذلك)؛ ربما أكثر من اللازم
  • باستخدام Generics لتجنب الملاكمة
  • العديد من التعديلات / twiddles / etc حول حلقات المعالجة الثنائية

في فوات الأوان، أعتقد أنني ارتكبت خطأ في نقطة الجنراء؛ التعقيد يعني أن إجبار الجنراء في النظام ثنيها من الشكل في أماكن قليلة, ، وتسبب بنشاط بعض المشاكل الرئيسية (للنماذج المعقدة) على الإطار المدمج.

لدي بعض التصاميم (في رأسي فقط) لإعادة تكوين هذا باستخدام عدمالواجهات اللاإرادية، وإلى بدلا من ذلك (للأطر المناسبة) تكسب المزيد من الاستخدام ILGenerator (كان خياري الأول كان Expression, ، ولكن هذا يجبر إصدار إطار أعلى). ومع ذلك، فإن المشكلة هي أن هذا سيستغرق وقتا كبيرا من الوقت للحصول على العمل، وحتى وقت قريب جدا لقد غمرت جميلة.

مؤخرا تمكنت من ابدأ في قضاء بعض الوقت على Protobuf-Net مرة أخرى, ، لذلك نأمل أن أوضح تراكم بلدي الطلبات وما إلى ذلك وتبدأ في ذلك قريبا. كما أن نيتي للحصول عليه مع النماذج آخر من التفكير (أي وصف رسم الخرائط السلكية بشكل منفصل).


ولا ينتج أي رمز ولدت

يجب علي أيضا توضيح أن هناك طريقين (اختياري) CodeGen إذا كنت ترغب في استخدام التعليمات البرمجية التي تم إنشاؤها؛ protogen.exe، أو و الوظيفة الإضافية, ، اسمح بجيل التعليمات من ملف .proto. ولكن هذا ليس كذلك ضروري - إنه مفيد أساسا إذا كان لديك ملف .proto موجود، أو نية الترابط مع لغة أخرى (C ++ إلخ) للتطوير الأول.

نصائح أخرى

أدائها جيد جدا!

يمكنك رؤية مقارنة شاملة بين التنسيقات المختلفة بما في ذلك Protobufhttp://maxondev.com/serialization-performance-comparison-c-port-formatsworks-xmldataconactserializer-xmlserializer-beryformermator-json-newtonsoft-serviceStack-Text/

تتضمن هذه المقارنة عينات بيانات كبيرة وصغيرة وتنسيقات مختلفة.

واحدة من الاختبارات في post-enter image description here

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top