مرحبًا٪ اسم المستخدم٪
كانت مهمتي هي مقارنة أداء التسلسل لـ .NET Core و Golang. بعد البحث في الإنترنت ، صادفت مستودعًا . يعتبر مثال بسيط عن خدمات REST المجهرية. هذا هو بالضبط ما أحتاجه ، فكرت. بعد رؤية نتائج الاختبار ، فوجئت. بعد النظر في شفرة المصدر ، أدركت ما الخطأ. إليك ما لم يعجبني:
- للتسلسل وإلغاء التسلسل ، يتم تحديد مجموعة من 3 عناصر. هذا واضح لا يكفي.
- بالنسبة إلى Golang ، لا يتم استخدام جميع ميزات اللغة ، ولكن كما تعلمون ، فإن المكتبة المدمجة للترميز / json بطيئة.
- نتيجة لذلك ، يقارن المؤلف أداء خوادم الويب kestrel و net / http.
كانت أوجه القصور هذه هي التي أدت إلى دراسة أكثر تفصيلاً للأداء في إطار المثال الموضح أعلاه. آمل أن تجد أنه من المثير للاهتمام معرفة النتائج.
تكوين ووصف البرنامج
تم أخذ الكود المصدري من المستودع أعلاه أيضًا كأساس. ما تم الانتهاء منه:
- لواجهة برمجة تطبيقات الخادم ، يتم استخدام fasthttp .
- يستجيب خادم API بمصفوفات السجلات.
- كل عميل لديه عدة طرق للتحقق.
الكود المعدل متاح في المستودع .
للتوضيح ، مثال JSON استجابة من API الخادم:
[ { "Id":"id_8299119732867115081", "Name":"name_5541535679032008745", "Time":1566731141 }, ... { "Id":"id_2804604318195309547", "Name":"name_5914011395631118540", "Time":1566731142 } ]
عملاء
لتقييم الأداء في كل خدمة ، يتم تطبيق ثلاث طرق:
- تلقي البيانات من خادم API وإرسالها دون معالجة [/ testNoProcess].
- تلقي البيانات من خادم API - إلغاء التسلسل ، التسلسل باستخدام انعكاس وإرسال [/ testReflection]. بالنسبة إلى .NETCore ، تم استخدام حزمة Newtonsoft.Json ، بالنسبة إلى Golang ، تم استخدام الترميز / json.
- تلقي البيانات من خادم API - إلغاء التسلسل ، التسلسل دون استخدام الانعكاس وإرسال [/ testNoReflection]. بالنسبة إلى .NETCore ، تم تطبيق حل يستند إلى Span لتقليل عدد عمليات تخصيص الذاكرة. تمتلك Golang حلاً جاهزًا - مكتبة easyjson ، التي أثبتت نفسها حصريًا في الجانب الإيجابي.
بناءً على هذه الاختبارات ، يمكنك تقييم الأداء النسبي لخوادم الويب (kestrel و net / http) ، وانخفاض الأداء عند معالجة البيانات باستخدام الانعكاس وبدونها للتطبيقات باللغتين.
وصف منهجية الاختبار
تم إجراء الاختبار على عدة مراحل من أجل تقييم أداء كل لغة وكل تطبيق.
لإنشاء تحميل ، تم اختيار الأداة المساعدة bombardier . تم تشغيل الأداة مع المعلمات التالية: -c 125 –d 120s ، والتي يمكن تفسيرها على النحو التالي: كيفية استخدام 125 مؤشرات ترابط مع وقت اختبار 120 ثانية.
تم تنفيذ قياس الأداء في 3 مراحل:
- بعد خادم RPS API. أجريت القياسات من أجل التمكن من تقييم تأثير طرق المعالجة على أداء كل طريقة.
- RPS قياس معالجة الاستجابة باستخدام التفكير.
- قياس معالجة استجابة RPS دون استخدام التفكير.
بناءً على هذه القياسات ، تم الحصول على بيانات حول أداء معالجة الاستجابة. استخدام جميع النوى المعالج كان 99.8-100 ٪. للتقييم ، تم اختيار البيانات الأولية من 10 و 30 و 100 و 500 سجل. صفائف 500 سجل في الإنتاج ليست شائعة ، لكنني كنت مهتمًا برؤية سلوك كل لغة.
موقف اختبار
تم تشغيل جميع الاختبارات على جهاز افتراضي يشغل Ubuntu Server 18.04 مع جميع التحديثات لشهر أغسطس 2019. لديها الخصائص التالية:
- المعالج كور I7-3770K - 4 النوى.
- ذاكرة الوصول العشوائي - 4 جيجابايت.
لمقارنة الأداء ، تم تثبيت .NET Core 2.2 و Golang 1.12.
حسنًا ، حان الوقت الآن للانتقال إلى الأكثر إثارة للاهتمام - النتائج.
النتائج
أدناه هو جدول مع نتائج الاختبار.

يمكنك أن تلاحظ على الفور أن Golang لديه خادم ويب أكثر إنتاجية. الفرق هو حوالي 12 ٪ مقارنة مع Kestrel في. NET الأساسية.
بناءً على البيانات أعلاه ، تم إنشاء رسمين بيانيين. بعد ذلك ، يمكنك رؤية مقارنة RPS بوضوح.

بسبب مكتبة net / http الأسرع ، تعرض Golang نتائج جيدة للبيانات الصغيرة. مع زيادة حجم البيانات ، تتم مقارنة الأداء مع kestrel.
عند استخدام الانعكاس على حجم بيانات صغير ، يكون RPS هو نفسه تقريبًا ، مع مراعاة خطأ القياس. مع زيادة حجم البيانات ، يعرض .NET Core المزيد من RPS.
عند الاختبار دون استخدام الانعكاس ، أظهرت كلتا اللغتين زيادة في الأداء. يظهر Golang أداء أفضل لأنه يحتوي في البداية على RPS أعلى (طلبات في الثانية) في الاختبارات دون معالجة. على البيانات الصغيرة ، ميزة كبيرة. مع زيادة حجم البيانات ، تتم مقارنة RPS تقريبًا. في أكبر اختبار من 500 سجل ، Golang هو مرة أخرى إلى الأمام.

في الاختبارات باستخدام التأمل ، فقدت جولانج على جميع الجبهات. وكان انخفاض الأداء في أسوأ السيناريوهات أكثر من 60 ٪. تنفيذ التسلسل خارج الصندوق للأداء لا قيمة له عمومًا.
بدون تفكير ، كان Golang أسرع في جميع الاختبارات. ومع نمو البيانات ، تتزايد ميزة Golang. في أي حال ، فإن رفض استخدام الانعكاس يعطي دفعة قوية للأداء لكل من Golang و .NETCore ، والتي ، بشكل عام ، يجب توقعها.
النتائج
ما هي الاستنتاجات التي يمكن استخلاصها من مقارنة الأداء الصغيرة هذه؟ أود صياغة هذا في شكل إيجابيات وسلبيات لكل من الحلول. لنبدأ مع Golang:
- له أداء أفضل ، ويمكن تحسينه ، على سبيل المثال ، باستخدام fasthttp كخادم ويب.
- بفضل إنشاء الشفرة - الاستخدام المريح لأساليب المعالجة دون استخدام التفكير.
- أقل استهلاك الذاكرة.
يحتوي .NET Core أيضًا على العديد من المزايا:
- الأداء مناسب لمعظم الحالات.
- في رأيي ، هذه واحدة من أفضل بيئات التطوير وأكثرها ملاءمة لبرنامج Visual Studio.
يمكن تلخيص النتيجة على النحو التالي: إذا كان لديك واجهة برمجة تطبيقات REST وكنت تخطط لحمل كبير ، وليس منطقًا تجاريًا معقدًا جدًا ، فمن الأفضل استخدام Golang ، في حالات أخرى يمكنك الحصول عليها باستخدام .NET Core. هل يجب إعادة كتابة الحلول الجاهزة من .NET Core إلى Golang؟ الجميع سوف يقرر لنفسه.
آمل أن تجد هذه المواد مفيدة. كل خير