سؤال

لماذا === اسرع من == في فب؟

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

المحلول

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

نصائح أخرى

=== لا يؤدي typecasting، لذلك 0 == '0' يقيم إلى true, ، لكن 0 === '0' - ل false.

أولا، === الشيكات لمعرفة ما إذا كانت الحججان هي نفسها اكتب - لذلك فشل الرقم 1 والسلسلة "1" على التحقق من النوع قبل تنفيذ أي مقارنات بالفعل. من ناحية أخرى، == لا تحقق من النوع أولا ويذهب قدما وتحول كلتا الحجج إلى نفس النوع ثم تقوم بالمقارنة.

لذلك، === أسرع عند التحقق من حالة الفشل

هناك شيئان للنظر فيه:

  1. إذا كانت أنواع المعامل مختلفة ثم == و === ينتج نتائج مختلفة. وبعد في هذه الحالة لا يهم سرعة المشغلين؛ ما يهم هو أي واحد ينتج النتيجة المرجوة.

  2. إذا كانت أنواع المعامل هي نفسها، يمكنك استخدامها أيضا == أو === كما كلاهما سوف ينتج نفس النتائج. وبعد في هذه الحالة، تكون سرعة كلا المشغلين مطابقين تقريبا. هذا لأنه لا يتم تنفيذ أي تحويل من قبل أي من المشغلين.

قارنت سرعة:

  • $a == $b ضد $a === $b
  • أين $a و $b كانت أعداد صحيحة عشوائية [1، 100
  • تم إنشاء المتغيرين ومقارنة مليون مرة
  • تم تشغيل الاختبارات 10 مرات

وهنا النتائج:

 $a == $b $a === $b
--------- ---------
 0.765770  0.762020
 0.753041  0.825965
 0.770631  0.783696
 0.787824  0.781129
 0.757506  0.796142
 0.773537  0.796734
 0.768171  0.767894
 0.747850  0.777244
 0.836462  0.826406
 0.759361  0.773971
--------- ---------
 0.772015  0.789120

يمكنك أن ترى أن السرعة متطابقة تقريبا.

لا أعرف حقا ما إذا كان الأمر أسرع بكثير، ولكن === في معظم اللغات مقارنة نوع مباشر، في حين أن == سيحاول القيام بالكوع الإكراه إذا لزم الأمر / ممكن لكسب مباراة.

the == يتحمل الأكبر في النفقات العامة للتحويل من النوع قبل المقارنة. === يقوم أولا بفحص النوع، ثم عائدات دون الحاجة إلى القيام بأي تحويل نوع.

لأن === لا تحتاج إلى إكراه المعاملات لتكون من نفس النوع قبل مقارنتها.

أشك في الفرق في السرعة أمر كذلك. في ظل الظروف العادية، يجب عليك استخدام أي من المشغل أكثر منطقية.

في الختام === أسرع لأنه لا يحول نوع البيانات لمعرفة ما إذا كان متغيران لهما نفس القيمة، ولكن عندما تحتاج إلى معرفة ما إذا كان لديك متغيران لهما نفس القيمة التي ستستخدمها == إذا لم تكن mather ما هو نوع المتغيرات ، أو === إذا كان الأمر مهم أيضا نوع المتغيرات.

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

إذا كانت نتائج الاختبار صحيحة، فيجب أن تكون مشكلة مترجم،

سيفعل المعالج كل ما يقال به القيام به على مدار الساعة

إذا كان أقل للقيام بذلك، فسيكون ذلك أسرع

إضافة:

آه جيدا في الواقع إذا قام برنامج التحويل البرمجي بالفعل بإنشاء الكثير من رمز الجهاز المراد معالجته، فما إذا كان قد أضفت بالفعل zillions من الأشياء للتعامل مع نوع البيانات التي تحتاج إلى مقارنة، ثم إزالة واحد "بسيط" إذا لن يغير السرعات كثيرا على الاطلاق.

إذا كان أي شخص ما زال يقرأ هذا، فأنا مثيري للاهتمام في المزيد من المناقشة.

فلم

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