سؤال

لقد رأيت الثانية في كود شخص آخر وأفترض أن مقارنة الطول هذه قد تم إجراؤها لزيادة إنتاجية الكود.تم استخدامه في محلل لغة نصية بقاموس محدد:تتكون الكلمات من 4 إلى 24 حرفًا بمتوسط ​​7-8 أحرف، وتتضمن الأبجدية 26 حرفًا لاتينيًا بالإضافة إلى "@" و"$" و"_".

تم استخدام مقارنة الطول للهروب == من عامل التشغيل الذي يعمل مع سلاسل STL، والتي من الواضح أنها تستغرق وقتًا أطول من مقارنة الأعداد الصحيحة البسيطة.ولكن في نفس الوقت، يكون توزيع الحرف الأول في القاموس المحدد أوسع من توزيع حجم الكلمات، لذلك سيكون الحرفان الأولان في مقارنة السلاسل مختلفين بشكل عام في كثير من الأحيان عن أحجام تلك السلاسل.وهذا يجعل مقارنة الطول غير ضرورية.

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

إذن سؤالي هو:لماذا يمكن أن تؤدي مقارنة الطول إلى تثبيت المقارنة ولماذا يمكن أن تبطئها؟

محدث:أنا لا أحب تلك الطريقة الثانية أيضًا، ولكن تم القيام بذلك لسبب ما، على ما أعتقد، وأنا أتساءل، ما هذا السبب.

التحديث 2:على محمل الجد، السؤال ليس كيف نفعل الأفضل.أنا لا أستخدم سلاسل STL في هذه الحالة بعد الآن.فلا عجب أن مقارنة الطول غير ضرورية وخاطئة وما إلى ذلك.العجيب هو أنه يميل إلى العمل بشكل أفضل قليلًا في اختبار معين.كيف يكون هذا ممكنا؟

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

المحلول

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

نصائح أخرى

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

متى يمكن أن تكون الدائرة القصيرة مفيدة؟

يمكن أن تكون تحسينات الدائرة القصيرة مفيدة فقط عندما:

  • تكلفة المقارنة منخفضة مقارنة بتكلفة الاختبار الكامل
  • غالبًا ما تؤدي المقارنة إلى ماس كهربائي

رياضياً، لنفترض أن S هي تكلفة حالة الدائرة القصيرة، وتكلفة F للحالة الكاملة، وP هي النسبة المئوية للحالات التي تحدث فيها الدائرة القصيرة (الحالة الكاملة ليست ضرورية).

متوسط ​​تكلفة الحالة الأصلية (بدون دائرة كهربائية قصيرة) هو F

متوسط ​​تكلفة تحسين الدوائر القصيرة هو S + F * (1-P)

لذلك، إذا كان للتحسين أي فائدة على الإطلاق، فيجب تطبيق ما يلي:

S + F * (1-P) < F

أي.

S <F*P

تكلفة مقارنة السلسلة

علاوة على ذلك كتبت:

والتي من الواضح أنها تستغرق وقتًا أطول من مقارنة الأعداد الصحيحة البسيطة.

وهذا ليس واضحا على الإطلاق.تنتهي مقارنة السلسلة عند العثور على الاختلاف الأول، وبالتالي اعتمادًا على السلاسل التي تقوم بمعالجتها، قد تنتهي عند الحرف الأول أو الثاني في الغالبية العظمى من الحالات.علاوة على ذلك، يمكن تحسين المقارنة حتى بالنسبة للسلاسل الأطول من خلال مقارنة DWORDS أولاً (4 أحرف في وقت واحد) طالما أن هناك بيانات كافية في كلا السلسلتين.

حالتك

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

بشكل عام، عليك أن تترك هذا الأمر للمحكمة الخاصة بلبنان ولا تقلق بشأنه.

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

سيكون ذلك أفضل من توزيع "التحسين" في جميع أنحاء التعليمات البرمجية الخاصة بك.

ليس لدى تنفيذ عامل std::string == أي وسيلة لمعرفة ما إذا كان سيكون من الأسرع التحقق من الطول أولاً أو البدء في التحقق من الأحرف.من الواضح أن التحقق من الطول يعد مضيعة للسلاسل ذات الطول نفسه.لذلك، من المرجح أن يكون أداء التطبيقات المختلفة لـ STL مختلفًا.

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

مقارنة الطول لا معنى لها بالنسبة لي..استخدام عامل المقارنة يكفي

إطلاق النار على تنفيذ المحكمة الخاصة بلبنان.لا ينبغي أن يهم

توجد مقارنة الطول لمحاولة تحسين الدائرة القصيرة.

أفترض أن مقارنة الطول أسرع من مقارنة السلسلة الكاملة، لذلك إذا كان ذلك يمكن أن يزيل 99٪ من حالات عدم التطابق، فسيكون أسرع من مقارنة السلسلة الكاملة في كل مرة.

سيقوم الكود بتنفيذ مقارنة الطول، وسيفشل، ثم سيتجاهل مقارنة السلسلة الكاملة ويتخطى الكود.

من المحتمل جدًا أن يكون طول std::string عضوًا في كائن std::string.بالمقارنة، قد يكون الحرف الأول موجودًا في الكومة.وهذا يعني أن مقارنة طول السلسلة تعمل على تحسين مكان المرجع.وبطبيعة الحال، مع تحسين السلسلة القصيرة، يصبح الأمر أكثر تعقيدًا - Lhs[0] قد يكون على الكومة في حين Rhs[0] على المكدس.

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