عالية الأداء التسلسل:جافا vs Google البروتوكول مخازن مقابل ...?

StackOverflow https://stackoverflow.com/questions/647779

سؤال

لبعض التخزين المؤقت أفكر بعمل القادم المشروع, لقد تم التفكير في جافا التسلسل.وهي ينبغي استخدامه ؟

الآن لقد كتبت سابقا مخصصة التسلسل وإلغاء التسلسل (Externalizable) لأسباب مختلفة في السنوات الماضية.في هذه الأيام التوافقية أصبح أكثر من قضية و لا يمكن التنبؤ تحتاج إلى التفاعل مع .صافي تطبيقات لذا فكرت باستخدام منصة مستقلة الحل.

وقد أي شخص لديه أي خبرة عالية الأداء استخدام الباوند?كيف تقارن من حيث السرعة والكفاءة مع جافا الأم التسلسل?بدلا من ذلك, هل هناك أي مخططات أخرى تستحق النظر?

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

المحلول

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

ولقد نشرت مؤخرا القياس إطار المخازن بروتوكول في جاوة و.NET. نسخة جافا في الرئيسية مشروع غوغل (باللغة في النقاط المرجعية دليل )، والنسخة NET هو في <لأ href =" http://code.google.com/p/protobuf -csharp الميناء / "يختلط =" noreferrer "> بلدي C # مشروع ميناء . إذا كنت ترغب في مقارنة سرعة PB مع سرعة التسلسل جافا يمكن أن تكتب الطبقات والمؤشر عليها مماثلة. إذا كنت مهتما في إمكانية التشغيل المتداخل على الرغم من أنني حقا لن تتخلى التسلسل جافا الأصلي (أو .NET التسلسل ثنائي الأصلي) الفكرة الثانية.

وهناك خيارات أخرى لالتسلسل قابلة للتشغيل المتبادل إلى جانب بروتوكول المخازن على الرغم - التوفير و <لأ href = " http://www.json.org/ "يختلط =" noreferrer "> JSON و YAML تتبادر إلى أذهاننا، وهناك بلا شك آخرين.

وتحرير: حسنا، مع إمكانية التشغيل المتداخل لا يجري في غاية الأهمية، فإنه من المفيد محاولة لسرد الصفات المختلفة التي تريد الخروج من إطار التسلسل. شيء واحد يجب أن نفكر هو الإصدار - وهذا هو آخر شيء PB تم تصميم للتعامل بشكل جيد، سواء الوراء وإلى الأمام (حتى برنامج جديد يمكن قراءة البيانات القديمة والعكس بالعكس) - عندما كنت عصا للقواعد المقترحة، وبطبيعة الحال :)

وبعد أن حاول أن تكون حذرا حول أداء جافا مقابل التسلسل الأصلي، وأنا حقا لن يفاجأ لتجد أن PB كان أسرع على أي حال. إذا كان لديك فرصة، استخدم VM الخادم - أظهرت بلدي معايير الأخيرة خادم VM أن <م> أكثر من ضعف سرعة في تسلسل وdeserializing البيانات النموذجية. أعتقد رمز PB يناسب JIT خادم VM لطيف جدا:)

ومثلما أرقام الأداء العينة، تسلسل والرسائل اثنين (واحد 228 بايت، واحدة 84750 بايت) deserializing حصلت هذه النتائج على جهاز الكمبيوتر المحمول باستخدام ملقم VM:

Benchmarking benchmarks.GoogleSize$SizeMessage1 with file google_message1.dat 
Serialize to byte string: 2581851 iterations in 30.16s; 18.613789MB/s 
Serialize to byte array: 2583547 iterations in 29.842s; 18.824497MB/s 
Serialize to memory stream: 2210320 iterations in 30.125s; 15.953759MB/s 
Deserialize from byte string: 3356517 iterations in 30.088s; 24.256632MB/s 
Deserialize from byte array: 3356517 iterations in 29.958s; 24.361889MB/s 
Deserialize from memory stream: 2618821 iterations in 29.821s; 19.094952MB/s 

Benchmarking benchmarks.GoogleSpeed$SpeedMessage1 with file google_message1.dat 
Serialize to byte string: 17068518 iterations in 29.978s; 123.802124MB/s 
Serialize to byte array: 17520066 iterations in 30.043s; 126.802376MB/s 
Serialize to memory stream: 7736665 iterations in 30.076s; 55.93307MB/s 
Deserialize from byte string: 16123669 iterations in 30.073s; 116.57947MB/s 
Deserialize from byte array: 16082453 iterations in 30.109s; 116.14243MB/s
Deserialize from memory stream: 7496968 iterations in 30.03s; 54.283176MB/s 

Benchmarking benchmarks.GoogleSize$SizeMessage2 with file google_message2.dat 
Serialize to byte string: 6266 iterations in 30.034s; 16.826494MB/s 
Serialize to byte array: 6246 iterations in 30.027s; 16.776697MB/s 
Serialize to memory stream: 6042 iterations in 29.916s; 16.288969MB/s 
Deserialize from byte string: 4675 iterations in 29.819s; 12.644595MB/s 
Deserialize from byte array: 4694 iterations in 30.093s; 12.580387MB/s 
Deserialize from memory stream: 4544 iterations in 29.579s; 12.389998MB/s 

Benchmarking benchmarks.GoogleSpeed$SpeedMessage2 with file google_message2.dat 
Serialize to byte string: 39562 iterations in 30.055s; 106.16416MB/s 
Serialize to byte array: 39715 iterations in 30.178s; 106.14035MB/s 
Serialize to memory stream: 34161 iterations in 30.032s; 91.74085MB/s 
Deserialize from byte string: 36934 iterations in 29.794s; 99.98019MB/s 
Deserialize from byte array: 37191 iterations in 29.915s; 100.26867MB/s 
Deserialize from memory stream: 36237 iterations in 29.846s; 97.92251MB/s 

وو"سرعة" مقابل "حجم" هي ما إذا كان هو الأمثل الشفرة التي تم إنشاؤها للسرعة أو حجم التعليمات البرمجية. (البيانات المتسلسلة هو نفسه في الحالتين. يتم توفير "حجم" نسخة عن حالة ما إذا كنت قد حصلت على الكثير من رسائل محددة ولا تريد أن تأخذ الكثير من الذاكرة لرمز).

وكما ترون، لرسالة الصغيرة يمكن أن يكون <م> جدا بسرعة - أكثر من 500 رسائل صغيرة تسلسل أو إلغاء تسلسل <م> في ميلي ثانية واحدة . حتى مع رسالة 87K انه أخذ أقل من ميلي ثانية واحدة لكل رسالة.

نصائح أخرى

واحد أكثر نقطة البيانات: هذا المشروع:

http://code.google.com/p/thrift-protobuf-compare /

ويعطي فكرة عن الأداء المتوقع لكائنات صغيرة، بما في ذلك التسلسل جافا على PB.

نتائج تختلف كثيرا بالاعتماد على النظام الأساسي الخاص بك، ولكن هناك بعض الاتجاهات العامة.

قد يكون أيضا نظرة على FST, انخفاض في استبدال المدمج في JDK التسلسل الذي ينبغي أن يكون أسرع و أصغر الانتاج.

الخام التقديرات على كثرة القياس فعلت في السنوات الأخيرة:

100% = الثنائية/البنية النهج (على سبيل المثالSBE, fst-البنيات)

  • غير مريح
  • تحليل نتائج العمل (بناء "الحقيقي" obejcts في الجانب المتلقي) قد تلتهم مزايا الأداء و هو لم شمل في المعايير

~10%-35% protobuf والمشتقات

~10%-30% سريع serializers مثل FST و KRYO

  • مريحة إلغاء تسلسل الكائنات يمكن أن تستخدم في معظم الأحيان مباشرة بدون إضافية دليل ترجمة التعليمات البرمجية.
  • يمكن أن يكون قوادا الأداء (الشروح الدرجة التسجيل)
  • الحفاظ على الروابط في كائن الرسم البياني (أي كائن تسلسل مرتين)
  • يمكن التعامل مع دوري الهياكل
  • عامة الحل الجراحي هو متوافق تماما أن جدك التسلسل

~2%-15% JDK التسلسل

~1%-15% سريع سلمان (مثلا ، جاكسون)

  • لا يمكن التعامل مع أي كائن الرسم البياني ولكن فقط مجموعة فرعية صغيرة من جافا هياكل البيانات
  • لا ref استعادة

0.001-1% كامل الرسم البياني سلمان/XML (مثلا ، JSON.io)

هذه الأرقام تعني أن تعطي صعبة للغاية النظام من حجم الانطباع.ملاحظة أن الأداء يعتمد كثيرا على هياكل البيانات يجري تسلسل/قياس.حتى واحد بسيط فئة المعايير هي في معظمها غير مجدية (ولكن شعبية:على سبيل المثالتجاهل unicode أي مجموعات،..).

انظر أيضا

http://java-is-the-new-c.blogspot.de/2014/12/a-persistent-keyvalue-server-in-40.html

http://java-is-the-new-c.blogspot.de/2013/10/still-using-externalizable-to-get.html

إذا كنت الخلط بين PB & الأصلية جافا التسلسل على سرعة وكفاءة ، PB.

  • PB كانت تهدف إلى تحقيق مثل هذه العوامل.انظر http://code.google.com/apis/protocolbuffers/docs/overview.html
  • PB البيانات صغيرة جدا في حين جافا التسلسل يميل إلى تكرار الكائن بأكمله ، بما في ذلك التوقيع.لماذا أنا دائما الحصول على صفي اسم الحقل اسم...تسلسل ، على الرغم من أنني أعلم أنه داخل في المتلقي ؟
  • التفكير عبر تطوير اللغة.الأمر يزداد صعوبة إذا كان جانب واحد يستخدم جافا ، جانب واحد يستخدم C++...

بعض المطورين تشير إلى الادخار ، ولكن أود أن استخدام جوجل PB لأن "أنا أؤمن جوجل" :-)..على أي حال, إنه يستحق نظرة:http://stuartsierra.com/2008/07/10/thrift-vs-protocol-buffers

ما الذي يعنيه الأداء العالي؟ إذا كنت تريد التسلسل الثانية ملي، وأنا أقترح عليك استخدام نهج التسلسل الذي هو أبسط. إذا كنت ترغب الفرعية ملي ثانية وأنت من المحتمل أن تحتاج إلى تنسيق ثنائي. إذا كنت ترغب أدناه بكثير 10 ثانية الصغيرة التي من المحتمل أن تحتاج إلى التسلسل المخصصة.

وأنا لم أر العديد من المعايير لتسلسل / إلغاء التسلسل ولكن قلة الدعم أقل من 200 ثانية الصغيرة للتسلسل / إلغاء التسلسل.

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

وهنا هو قبالة اقتراح جدار :-) اليوم (أنت فقط أنب شيء في رأسي أنني أريد الآن لمحاولة) ...

وإذا كان يمكنك الذهاب للحل المؤقت كله عبر هذا أنه قد عمل: مشروع شباب لك . كما أنها مصممة عال جدا خادم اللعبة الأداء، وتحديدا بحيث يقرأ هي سريعة (جيد جدا لمخبأ). لديها جافا وC واجهات برمجة التطبيقات لذلك أعتقد (يعتقد أنها كانت منذ فترة طويلة كنت قد بحثت في ذلك، وأنا لم أفكر في هذا في ذلك الوقت) التي يمكن أن حفظ الأشياء مع جافا وقراءتها مرة أخرى في C والعكس بالعكس.

إذا أي شيء آخر أنها سوف تعطيك شيئا لتقرأ على اليوم: -)

لالتسلسل سهلة الأسلاك، والنظر في استخدام واجهة Externalizable. تستخدم بذكاء، سيكون لديك المعرفه الحميمة لاتخاذ قرار بشأن كيفية الأمثل مارشال وunmarshall مجالات محددة. قال ذلك، سوف تحتاج إلى إدارة الإصدارات من كل كائن بشكل صحيح - من السهل إلغاء مارشال، ولكن إعادة التنظيم، كائن V2 عندما يدعم الشفرة V1 إما كسر، وفقدان المعلومات، أو البيانات أسوأ الفاسدة بطريقة تطبيقاتك ليست قادرة على معالجة بشكل صحيح. إذا كنت تبحث عن مسار الأمثل، حذار لن مكتبة حل مشكلتك دون بعض التنازلات. عموما مكتبات تناسب معظم حالات الاستخدام وسوف تأتي مع فائدة إضافية أنها سوف تكييف وتحسين مرور الوقت من دون المدخلات الخاصة بك، إذا كنت قد اختارت مشروع مفتوح المصدر النشط. وأنها قد تزيد من المشاكل الأداء، وإدخال البق، وحتى إصلاح الخلل التي لم تتأثر لك بعد!

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