خيط القفز

في مجال الحوسبة ، يُعدّ الربط بين القفزات تحسينًا من قِبل المُصرّف، حيث يُتيح الانتقال مباشرةً من قفزة إلى أخرى. إذا كانت القفزة الثانية مجموعة جزئية أو معكوسة للقفزة الأولى، يُمكن حذفها أو تمريرها عبر القفزة الأولى. [ 1 ] يُمكن إنجاز ذلك بسهولة في دورة واحدة للبرنامج، باتباع قفزات متسلسلة غير دورية حتى يصل المُصرّف إلى نقطة ثابتة.

فوائد

تتمثل الفائدة الرئيسية لتقنية تعدد الخيوط في تقليل عدد عمليات القفز التي تُنفذ ديناميكيًا. وهذا يُفسح المجال لمزيد من التحسينات نظرًا لانخفاض عدد الشروط، مما يُحسّن الأداء. في المتوسط، يُمكن توقع حذف 2-3 تعليمات نتيجةً لإزالة ناجحة لفرع وقت التشغيل . [ 2 ]

أمثلة

يوضح الكود الزائف التالي متى يمكن تنفيذ عملية القفز بشكل متزامن.

 10. a = SomeNumber(); 20. إذا كانت قيمة a أكبر من 10، فانتقل إلى 50 ... 50. إذا كانت قيمة a أكبر من 0، فانتقل إلى 100 ...

سيتم تنفيذ القفزة على الخط 50 دائمًا إذا تم تنفيذ القفزة على الخط 20. لذلك، طالما أن الخط 100 يقع ضمن نطاق القفزة (أو لا يهم حجم القفزة)، يمكن تعديل القفزة على الخط 20 بأمان للانتقال مباشرةً إلى الخط 100.

مثال آخر يوضح عملية الربط بين حالتي تداخل جزئي:

void baz ( bool x , bool y , bool z ) {إذا ( س && ص )حاجِز ()؛إذا ( ص || ع )foo ();}

يمكن تحويل ما سبق إلى:

void baz ( bool x , bool y , bool z ) {إذا كان ( س و ص ) {حاجِز ()؛goto jmp ;}إذا ( ص || ع ) {قفزة :foo ();}}

إذا تم اختيار الفرع الأول، xوكان yكلا الشرطين صحيحين ( ربط منطقي )، فلا حاجة لتقييم التعبير ( فصل منطقي ). لذلك، يتم الانتقال إلى التسمية . [ 2 ]y || zjmp

انظر أيضاً

مراجع