سؤال

boolean a = false, b = true;
if ( a && b ) { ... };

في معظم اللغات ، b لن تحصل على تقييم a هي كاذبة جدا a && b لا يمكن أن يكون صحيحا.سؤالي هو لن الدائرة القصيرة يكون أبطأ في مجال العمارة ؟ في خط أنابيب هل المماطلة أثناء الانتظار للحصول على نتيجة لتحديد ما إذا ب ينبغي تقييم أو لا ؟ سيكون من الأفضل أن تفعل متداخلة الاتحاد بدلا من ذلك ؟ هل هذا يساعد ؟

أيضا, لا أحد يعرف ما short-circuit التقييم عادة يسمى ؟ هذا التساؤل بعد أن اكتشفت أن البرمجة بلدي صديق قد سمعت أبدا من دائرة قصر التقييم وذكرت أنها ليست شائعة ولا توجد في كثير من اللغات و هو غير فعال في خط أنابيب.أنا غير متأكد حول آخر, لذلك أطلب منك أيها الناس!

حسنا, أعتقد مختلفة سبيل المثال ربما شرح فيها صديقي قد تكون قادمة من.ويعتقد أنه منذ تقييم بيان مثل التالية في الموازية:

(a) if ( ( a != null ) && ( a.equals(b) ) ) { ... }

سوف تعطل النظام ، العمارة التي لا تفقد أعصابها (وبالتالي عدم السماح البيانات مثل ما ورد أعلاه) سيكون أسرع في معالجة البيانات مثل هذه:

(b) if ( ( a == 4 ) && ( b == 5 ) )

لأنه إذا لم يستطع فعله (أ) في موازاة ذلك, فإنه لا يمكن أن تفعل (ب) في الموازي.في هذه الحالة, اللغة التي يسمح الدائرة قصيرة أبطأ من تلك التي لا.

أنا لا أعرف إذا كان ذلك صحيحا أم لا.

شكرا

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

المحلول

الدائرة قصيرة التعبيرات المنطقية هي بالضبط ما يعادل نحو مجموعة متداخلة ifs ، لذلك فعالة مثل أن يكون.

إذا ب لا يكون لها آثار جانبية, يمكن أن يكون لا يزال تنفيذها بالتوازي مع (أي قيمة "بالتوازي" ، بما في ذلك pipelining).

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

ولكن الدائرة قصيرة يستخدم التحكم في التدفق بقدر ما حفظ العمل لا لزوم لها.ومن الشائع بين اللغات لقد استعملت على سبيل المثال Perl لغة:

open($filename) or die("couldn't open file");

قذيفة المصطلح:

do_something || echo "that failed"

أو C/C++/Java/الخ المصطلح:

if ((obj != 0) && (obj->ready)) { do_something; } // not -> in Java of course.

في كل هذه الحالات تحتاج الدائرة قصيرة ، بحيث RHS هو إلا تقييم إذا LHS يملي أنه ينبغي أن يكون.في مثل هذه الحالات ليس هناك نقطة مقارنة الأداء مع بديل رمز هذا خطأ!

نصائح أخرى

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

فروع لا عادة المماطلة في خط أنابيب ، ولكن المعالج سوف تخمين ما إذا كان فرع يؤخذ أو لا و إذا كان المعالج هو الخطأ في ذلك أن مسح كل ما حدث منذ ذلك جعل تخمين خاطئ من خط الأنابيب.

ماس كهربائى التقييم هو أيضا الاسم الأكثر شيوعا و هو موجود في معظم اللغات في بعض شكل أو آخر.

أنا بصراحة لا تقلق بشأن ذلك.اختبار منطقية هو سريع حقا.الدائرة قصيرة فقط يحصل مثيرة للاهتمام / مفيدة عند التعبير الثاني له آثار جانبية:

if ( ConfirmAction() && DestroyAllData() )
   Reboot();

أو يعتمد على الاختبار الأول:

if ( myDodgyVar != null && myDodgyVar.IsActive() )
   DoSomethingWith(myDodgyVar);

اللغات الداعمة قصيرة-الدائرة:

ادا, إيفل, ALGOL 68, C1, C++, C#, Java, R, إرلانج القياسية مل, جافا سكريبت, MATLAB, Lisp, Lua, مخطط, OCaml, هاسكل, Pascal,Perl, Ruby, PHP, Python, Smalltalk, Visual Basic .صافي

مأخوذة من Short-circuit التقييم

VB.Net يحتوي بناء جملة مختلف اعتمادا على ما إذا كان أو لا تريد أن ماس كهربائى أو لا.لأن من أسباب الإرث, السلوك الافتراضي هو لا ماس كهربائى.بناء الجملة كما يلي

غير ماس كهربائى

IF A And B THEN
    ...
END IF

ماس كهربائى

IF A AndAlso B THEN
    ...
END IF

يمكنك استخدام أو / OrElse إذا كنت ترغب في دارة قصيرة أو بيان.التي هي لطيفة حقا في مثل الحالات التالية

If MyObj IsNot Nothing AndAlso MyObj.Value < SomeValue Then
    ....
End If

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

أولا صديقك هو الخطأ.Short-circuit التقييم (الملقب الحد الأدنى من التقييم) متوفر في معظم اللغات و هو أفضل من تداخل الاتحاد الموازي اللغات (في هذه الحالة الأولى من الظروف التي يعود سوف يسبب التنفيذ لمواصلة)

في أي حال ، حتى في مباشر غير متوازية اللغة أنا لا أرى كيف متداخلة الاتحاد سيكون أسرع تنفيذ ستمنع حتى الشرط الأول هو تقييم.

كيف يمكن متداخلة إن لم يكن المماطلة ؟ في الواقع إذا كان a و b كل من المتغيرات وليس عبارات ذات الآثار الجانبية ، ويمكن تحميلها بشكل متواز جيد المترجم.ليس هناك فائدة من استخدام أكثر ifs إلا زيادة الخط الخاص بك العد.حقا سيكون هذا أسوأ نوع من التخمين الثاني مترجم.

هذا يسمى short-circuit التقييم.

مفيدة كهربائى يمكنني استخدام شيء مثل هذا:

if (a != null && a.equals(somevalue)) {
    ... do something.
}

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

جميع رأيي على الرغم من.

معظم اللغات قصيرة-الدائرة تقييم التعبيرات المنطقية.لطالما سمعت يشار إلى اختزال التقييم.

على سبيل المثال في السؤال جدا التبسيط سبيل المثال لا توفر الكثير من الأداء فائدة.أداء تستفيد يأتي عندما تعبيرات معقدة لتقييم.

كمثال عندما سيكون هذا جيد تخيل لعبة برنامج لديه شيء من هذا القبيل:

if (someObject.isActive() && someOtherObject.isActive() && CollisionDetection.collides(someObject, someOtherObject) {
  doSomething();
}

في هذه الحالة الكشف عن التصادم هو أكثر تكلفة بكثير من النشطة الشيكات.سيكون هناك دفعة كبيرة في الأداء إذا كان هناك الكثير من نشط الكائنات في النظام.

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

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

متداخلة الاتحاد سوف يكون له نفس التأثير كما تفقد أعصابها &&.

'Short-circuit التقييم' هو الاسم الأكثر شيوعا و صديقك عن كونها شائعة;فإنه من الشائع جدا.

أنا لا أعرف أي شيء عن pipelining ، ولكن short-circuit التقييم هو سمة مشتركة في العديد من اللغات (و هذا أيضا اسم أعلم ذلك من قبل).في C ، & & و المشغلين الآخرين تعريف تسلسل نقطة تماما مثل ؛ المشغل لا ، لذلك أنا لا أرى كيف short-circuit التقييم هو أي أقل كفاءة من مجرد استخدام بيانات متعددة.

لقد سمعت منه كما كهربائى.في أنابيب لا العملية القادمة أن يذهب تعتمد على نتائج إذا كان البيان ؟ إذا كان هذا هو الحال وهذا من شأنه أن أكثر الأمثل لذلك عليكي اختبار اثنين القيم في كل مرة.

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

a = obj.somethingQuickToTest() && obj.somethingSlowToTest();

لا يبدو أن يكون مختلفا

a = false;
if(obj.somethingQuickToTest())
   a = obj.somethingSlowToTest();

اعتمادا على السياق ، يمكن أيضا أن يسمى "حراسة".

و لقد رأيت ذلك في كل لغة عملت في الذي يدفع نحو عشرة.

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