Node.js مقابل.Net الأداء




performance (4)

لقد قرأت الكثير عن Node.js كونها سريعة وقادرة على استيعاب كميات كبيرة من الحمل. هل لدى أي شخص أي دليل واقعي على هذا مقابل الأطر الأخرى ، خصوصًا .Net؟ معظم المقالات التي قرأتها هي قصصية أو ليس لديها مقارنات مع .Net.

شكر


الفرق الرئيسي ما أراه هو أن العقدة. js هي لغة برمجة ديناميكية (التحقق من الكتابة) ، لذلك يجب أن تكون الأنواع مشتقة من وقت التشغيل. إن اللغات المكتوبة بقوة مثل C # .NET لها نظريا قدر أكبر من الكسب المحتمل لمحاربة العقدة .js (و PHP الخ) ، خصوصا عندما يكون الحساب باهظ الثمن. بالمناسبة ، يجب أن يكون لدى .NET interoperation أصلي أفضل مع C / C ++ من عقدة. js.


تميل خوادم NIO (Node.js وغيرها) إلى أن تكون أسرع من خوادم BIO. (IIS الخ). لدعم مطالبتي ، TechEmpower هي شركة متخصصة في معايير إطار عمل الويب . فهي مفتوحة جدا ولها طريقة قياسية لاختبار جميع framewrks.

تعتبر اختبارات الجولة التاسعة هي الأحدث حاليًا (مايو 2014). هناك العديد من النكهات التي تم اختبارها في معهد الدراسات الإسماعيلية ، ولكن يبدو أن aspnet-stripped هو أسرع متغير لـ IIS.

فيما يلي النتائج في الردود في الثانية (أعلى أفضل):

  • JSON Serialization
    • nodejs: 228,887
    • 105,272 جردت: 105,272
  • استعلام واحد
    • nodejs-mysql: 88,597
    • اسبنيت - جردت خام: 47,066
  • استعلامات متعددة
    • nodejs-mysql: 8,878
    • aspnet-stripped-raw: 3,915
  • نص عادي
    • nodejs: 289,578
    • 109,136 جردت: 109,136

في جميع الحالات ، يميل Node.js إلى أن يكون 2x + أسرع من IIS.


يجب أن أتفق مع ماركوس غرانستروم أن السيناريو مهم جدا هنا.

لأكون صريحًا ، يبدو أنك تتخذ قرارًا معماريًا عالي التأثير. ستكون نصيحتي لعزل مجالات القلق والقيام "اخبز" بين مداخن ما كنت تفكر.

في نهاية اليوم أنت مسؤول عن القرار ولا أعتقد أن العذر "أظهر لي شخص ما على مقالا قال أنه سيكون على ما يرام" سوف يقطعها مع رئيسك في العمل.


يجري FAST والتعامل مع الكثير من LOAD هما شيئان مختلفان. قد يكون الخادم الذي يقدم خدمة FAST بالفعل في تقديم طلب واحد في كل ثانية نكرًا تامًا إذا أرسلت 500 طلب في الثانية (تحت LOAD ).

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

أنا أعتقد أنك تبحث عن مقارنة بين ASP.NET والعقدة. في هذه المعركة ، بعد تجميع / تفسير كل شيء ، من المحتمل أن تكون قريبًا جدًا من الأداء. ربما يكون .NET سريعًا بشكل كبير أو ربما يكون العقدة أسرع قليلاً ، ولكنه على الأرجح قريب بما فيه الكفاية بحيث لا يهمك. أراهن على. NET ، لكنني لا أعرف على وجه اليقين.

المكان الذي تكون فيه العقدة جذابًا بالفعل هو التعامل مع التحميل . هذا هو المكان الذي تختلف فيه التكنولوجيات حقاً. يخصص ASP.NET مؤشر ترابط لكل طلب من تجمع مؤشر الترابط الخاص به وبمجرد استنفاد ASP.NET كافة طلبات مؤشرات الترابط المتوفرة تبدأ في الحصول على قائمة الانتظار. إذا كنت تخدم تطبيقات "Hello World" مثل المثال من قبلshankar ، فهذا قد لا يهم كثيرًا لأن المواضيع لن يتم حظرها وستكون قادرًا على التعامل مع الكثير من الطلبات قبل نفاد الخيوط. تأتي المشكلة مع طراز ASP.NET عند بدء إنشاء طلبات I / O التي حظر مؤشر الترابط (استدعاء DB ، تقديم طلب http إلى خدمة ، قراءة ملف من القرص). تعني طلبات حظر هذه أن مؤشر الترابط الخاص بك القيمة من تجمع مؤشر الترابط هو عدم القيام بأي شيء. كلما كان لديك حظر أكثر ، كلما كان تحميل تطبيق ASP.NET أقل قدرة على العرض.

لمنع هذا الحظر ، تستخدم منافذ إتمام الإدخال / الإخراج التي لا تتطلب تثبيت مؤشر ترابط أثناء انتظار استجابة. يدعم ASP.NET هذا ، ولكن للأسف العديد من الأطر / المكتبات الشائعة في .NET DON'T. على سبيل المثال ، يدعم ADO.NET منافذ إكمال الإدخال / الإخراج ، ولكن لا يستخدمها Entity Framework. لذلك يمكنك إنشاء تطبيق ASP.NET غير متزامن تمامًا ويتعامل مع الكثير من التحميل ، ولكن معظم الناس لا يفعلون ذلك لأنه ليس سهلاً مثل بناء واحد متزامن ، وقد لا تتمكن من استخدام بعض الأجزاء المفضلة لديك من الإطار (مثل linq إلى الكيانات) إذا قمت بذلك.

كانت المشكلة أن ASP.NET (و .NET Framework) تم إنشاؤها لتكون unictated حول I / O غير متزامن. لا تهتم .NET إذا كتبت رمزًا متزامنًا أو غير متزامن ، لذلك الأمر متروك للمطور لاتخاذ هذا القرار. جزء من هذا هو أنه كان يعتقد أن البرمجة النصية و البرمجة بالعمليات غير المتزامنة هي "صلبة" ، و تريد .NET أن تجعل الجميع سعداء (غير متنبئين وخبراء). لقد أصبح الأمر أكثر صعوبة لأن .NET انتهى بـ 3-4 أنماط مختلفة للقيام بالتزامن. يحاول .NET 4.5 العودة إلى تحديث إطار .NET ليتمتع بنموذج الرأي حول Iync IO ، ولكن قد يكون بعض الوقت حتى تدعمه بالفعل الأطر التي تهتم بها.

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

مرة أخرى ، ليس لدي أي أرقام صلبة لإثباتها بطريقة أو بأخرى ، ولكن أعتقد أن العقدة ستفوز في مسابقة LOAD لتطبيق الويب المعتاد. قد يمنح تطبيق NET المحسّن للغاية (100٪ المتزامن) .NET التطبيق المكافئ node.js تشغيلًا لنقوده ، ولكن إذا كنت قد حصلت على متوسط ​​جميع تطبيقات .NET وجميع التطبيقات في العقدة ، فستتناول العقدة المتوسطة المزيد حمل.

امل ان يساعد.





node.js