سؤال

أرغب في إنشاء خادم وكيل http بسيط يقوم ببعض المعالجة الأساسية للغاية على رؤوس http (على سبيل المثال:إذا كان الرأس x == y، فافعل z).قد يحتاج الخادم إلى دعم مئات المستخدمين.يمكنني كتابة الخادم بلغة C# (سهل جدًا) أو c++ (أصعب بكثير).ومع ذلك، هل سيكون لإصدار C# أداء جيد مثل إصدار C++؟إذا لم يكن الأمر كذلك، فهل سيكون الفرق في الأداء كبيرًا بما يكفي بحيث لا يكون من المنطقي كتابته بلغة C#؟

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

المحلول

يمكنك استخدام غير آمن كود C# و مؤشرات في نقاط الاختناق الحرجة لجعله يعمل بشكل أسرع.يتصرف هؤلاء كثيرًا مثل كود C++ وأعتقد أنه يتم تنفيذه بسرعة.

لكن في معظم الأوقات، تكون لغة C# سريعة جدًا بالفعل، ولا أعتقد أنه سيكون هناك الكثير من الاختلافات كما هو الحال مع ما قاله الجميع.

ولكن هناك شيء واحد قد ترغب في أخذه في الاعتبار وهو: تعد عمليات سلسلة التعليمات البرمجية المُدارة (C#) بطيئة إلى حد ما مقارنة باستخدام المؤشرات بشكل فعال في C++. هناك المزيد من حيل التحسين باستخدام مؤشرات C++ مقارنةً بسلاسل CLR.

أعتقد أنني قمت ببعض المعايير من قبل، لكن لا أتذكر أين وضعتها.

نصائح أخرى

لماذا تتوقع أداء أعلى بكثير من تطبيق C++؟

لا يوجد أي تباطؤ متأصل يضيفه تطبيق C# عندما تقوم بذلك بشكل صحيح.(ليس هناك عدد كبير جدًا من المراجع المسقطة، أو إنشاء/إسقاط كائن متكرر لكل مكالمة، وما إلى ذلك)

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

قد يكون مترجم C++ أفضل في إنشاء تعليمات برمجية سريعة، ولكن غالبًا ما يتم إهدار هذا في معظم التطبيقات.إذا كان لديك بالفعل جزء من طلبك يجب أن يكون سريعًا للغاية، فحاول كتابة استدعاء C لتلك النقطة الفعالة.

فقط إذا كان معظم النظام يتصرف ببطء شديد، فيجب أن تفكر في كتابته بلغة C/C++.ولكن هناك العديد من المزالق التي قد تقتل أدائك في كود C++ الخاص بك.

(تيلدر:يمكن لخبير C++ إنشاء تعليمات برمجية "أسرع" باعتباره خبيرًا في لغة C#، ولكن قد يقوم مبرمج C++ المتوسط ​​بإنشاء تعليمات برمجية أبطأ من لغة C# المتوسطة)

أتوقع أن يكون إصدار C# بنفس سرعة إصدار C++ ولكن مع مساحة ذاكرة أصغر.في بعض الحالات، تكون التعليمات البرمجية المُدارة أسرع كثيرًا وتستخدم ذاكرة أقل مقارنةً بـ C++ غير المُحسّنة.يمكن أن تكون تعليمات برمجية C++ أسرع إذا كتبها خبير، ولكنها نادرًا ما تبرر الجهد المبذول.

كملاحظة جانبية، يمكنني أن أتذكر "مسابقة" الأداء في عالم التدوين بين مايكل كابلان (c#) وريموند تشان (C++) لكتابة برنامج، والذي يفعل نفس الشيء تمامًا.نجح ريموند تشان الذي يعتبر من أفضل المبرمجين في العالم (جويل) في كتابة لغة C++ بشكل أسرع بعد صراع طويل في إعادة كتابة معظم التعليمات البرمجية.

سيتعامل الخادم الوكيل الذي تصفه في الغالب مع بيانات السلسلة وأعتقد أنه من المعقول تنفيذه في C#.في المثال الخاص بك،

if header x == y, do z

قد يكون الجزء الأبطأ هو القيام بكل ما هو "z" وسيتعين عليك القيام بهذا العمل بغض النظر عن اللغة.

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

لن أفكر مرتين في كتابة نوع البرنامج الذي تصفه بلغة مُدارة (سواء كانت Java أو C# وما إلى ذلك).في هذه الأيام، غالبًا ما يتم تعويض مكاسب الأداء التي تحصل عليها من استخدام لغة ذات مستوى أدنى (من حيث القرب من الأجهزة) بسهولة من خلال قدرات وقت التشغيل للبيئة المُدارة.بالطبع يأتي هذا من مطور C#/python لذا فأنا لست غير متحيز تمامًا ...

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

بافتراض أنك بحاجة إلى تقديم خدمة أقل من 200 QPS أو حواليها على جهاز واحد، فمن المفترض أن تلبي لغة C# احتياجاتك بسهولة - حتى اللغات المعروفة بالبطء (على سبيل المثال.Ruby) يمكنها بسهولة ضخ بضع مئات من الطلبات في الثانية.

وبصرف النظر عن الأداء، هناك أسباب أخرى لاختيار C#، على سبيل المثال.من الأسهل بكثير كتابة تجاوزات المخزن المؤقت في C++ مقارنة بـ C#.

هل سيتم تشغيل خادم http الخاص بك على جهاز مخصص؟إذا كانت الإجابة بنعم، أود أن أقول استخدام C# إذا كان ذلك أسهل بالنسبة لك.إذا كنت بحاجة إلى تشغيل تطبيقات أخرى على نفس الجهاز، فستحتاج إلى أن تأخذ في الاعتبار حجم الذاكرة لتطبيقك وحقيقة أن GC سيتم تشغيله في أوقات "عشوائية".

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