سؤال

ما هي الاختلافات الأكثر وضوحا بين المخازن المؤقتة في بروتوكول Google و ASN.1 (مع ترميز)؟ بالنسبة لمشروعي، فإن المشكلة الأكثر فرضا هي حجم البيانات المتسلسلة. هل قام أحد بأي مقارنات بحجم البيانات بين الاثنين؟

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

المحلول

إنه وقت طويل منذ أن قمت بأي عمل ASN.1، ولكن من المحتمل جدا أن يعتمد الحجم على تفاصيل أنواعك والبيانات الفعلية.

أود بقوة يوصي بأنك نموذجا أوليا على حد سواء ووضع بعض البيانات الحقيقية للمقارنة.

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

نصائح أخرى

إذا كنت تستخدم ASN.1 مع غير مقصودة لكل، وتحديد أنواع البيانات الخاصة بك باستخدام القيود المناسبة (على سبيل المثال، تحديد حدود أقل / علوية للأعداد الصحيحة، الحدود العليا لطول القوائم، وما إلى ذلك)، ستكون الترميزات مضغوطة للغاية. لن تكون هناك بت هدر للأشياء مثل المحاذاة أو الحشو بين الحقول، وسيتم تشفير كل حقل في الحد الأدنى لعدد البتات اللازمة لعقد نطاق القيم المسموح بها. على سبيل المثال، سيتم تشفير حقل عدد صحيح من النوع (1..8) في 3 بت (1 = '000'، 2 = '001'، ...، 8 = '111')؛ واختيار مع أربعة بدائل ستحتل 2 بت (يشير إلى البديل المختار) بالإضافة إلى البتات المحتلة من قبل البديل المختار. يحتوي ASN.1 على العديد من الميزات الأخرى المثيرة للاهتمام التي استخدمت بنجاح في العديد من المعايير المنشورة. مثال على ذلك هو علامة الامتداد ("...")، والتي عند تطبيقها على التسلسل، والاختيار، والأنواع الأخرى، تتيح التوافق مع الوراء والأمام بين نقاط النهاية التي تنفذ إصدارات مختلفة من المواصفات.

عندما يكون حجم الرسالة المعبأة / المشفر مهمة يجب أن تلاحظ أيضا حقيقة أن Protobuf غير قادر على حزمة repeated الحقول التي ليست من primitive numeric type, اقرا هذا للمزيد من المعلومات.

هذه مشكلة على سبيل المثال إذا كان لديك رسائل من هذا النوع: (يحدد التعليق النطاق الفعلي للقيم)

message P{
    required sint32 x = 1; // -0x1ffff  to  0x20000
    required sint32 y = 2; // -0x1ffff  to  0x20000
    required sint32 z = 3; // -0x319c  to   0x3200
}
message Array{
    repeated P ps = 1;
    optional uint32 somemoredata = 2;
}

في حالة وجود طول مجموعة من مجموعة، على سبيل المثال، 32 مما سؤدي إلى حجم رسالة معبأة حوالي 250 إلى 450 بايت مع Protobuf، اعتمادا على القيم التي تحتوي عليها الصفيف بالفعل. يمكن أن يزيد هذا حتى أكثر من 1000 بايت في حالة استخدام نطاق 32 بت كامل أو في حال كنت تستخدم int32 بدلا من sint32 ولها قيم سلبية.

BLOB البيانات الخام (على افتراض أنه يمكن تعريف Z كما int16 القيمة) سوف تستهلك فقط 320 بايت وبالتالي ASN.1. الرسالة دائما أصغر من 320 بايت لأن القيم القصوى ليست في الواقع 32 بت ولكن 19bit (x، y) و 15 بت (z).

يمكن تحسين حجم رسالة Protobuf مع تعريف الرسالة هذه:

message Ps{
    repeated sint32 xs = 1 [packed=true];
    repeated sint32 ys = 2 [packed=true];
    repeated sint32 zs = 3 [packed=true];
}
message Array{
    required Ps ps = 1;
    optional uint32 somemoredata = 2;
}

مما يؤدي إلى نتائج أحجام الرسائل بين حوالي 100 بايت (جميع القيم هي الأصفار)، 300 بايت (القيم الموجودة في النطاق كحد أقصى)، و 500 بايت (كل القيم قيم 32 بت).

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