انعكاس الحلقة

في علوم الحاسوب ، يُعدّ عكس الحلقات تحسينًا للمترجم وتحويلًا للحلقات ، حيث تُستبدل حلقة while بكتلة if تحتوي على حلقة do..while . [ 1 ] عند استخدامه بشكل صحيح، قد يُحسّن الأداء بفضل تجميع التعليمات أو تجنّب تعليمات القفز لتقليل أخطاء التنبؤ بالتفرع . [ 1 ]

في حلقة التكرار غير المحدودة (while loop)، يجب اختبار الشرط في كل تكرار. عند فشل الاختبار، يتم إنهاء الحلقة. بوضع الاختبار في نهاية جسم الحلقة، يتجنب عكس الحلقة أي قفزات في نهاية التكرار الأخير.

مثال بلغة جافا

void pre_inversion () { while ( /* الشرط */ ) { /* جسم الحلقة */ } }

يعادل ما يلي:

void post_inversion () { if ( /* الشرط */ ) { do { /* جسم الحلقة */ } while ( /* الشرط */ ); } }

لا يحدث أي تغيير في الأداء في التكرارات الأولية وغير النهائية للحلقة، بما في ذلك عندما لا يتم الدخول إلى الحلقة لأن الشرط خاطئ. ومع ذلك، يحتوي التكرار الأخير على تعليمتي ​​قفز أقل عند الدخول إلى الحلقة لأن حلقة do-while لا تحتاج إلى القفز إلى بداية حلقة while لتقييم شرط الحلقة. [ 1 ]

مثال بلغة C

int i , a [ 100 ]; i = 0 ; while ( i < 100 ) { a [ i ] = 0 ; i ++ ; }

يعادل ما يلي:

int i , a [ 100 ]; i = 0 ; if ( i < 100 ) { do { a [ i ] = 0 ; i ++ ; } while ( i < 100 ); }

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

بالإضافة إلى ذلك، يسمح عكس الحلقة بنقل الكود بشكل آمن وغير متغير مع الحلقة .

مثال باستخدام رمز العنوان الثلاثي

 i := 0 المستوى 1: إذا كانت قيمة i أكبر من أو تساوي 100، فانتقل إلى المستوى 2 a[i] := 0 i := i + 1 انتقل إلى L1 المستوى الثاني: 

لو تم تهيئتي بقيمة 100، لكانت التعليمات التي يتم تنفيذها أثناء التشغيل كالتالي:

 إذا كان i >= 100  انتقل إلى المستوى 2 

لنفترض أن قيمة i قد تم تهيئتها إلى قيمة أقل من 100. والآن دعونا ننظر إلى التعليمات التي تم تنفيذها في اللحظة التي تلت زيادة قيمة i إلى 99 في الحلقة:

 انتقل إلى L1  إذا كانت قيمة i أقل من 100  a[i] := 0  i := i + 1  انتقل إلى L1  إذا كان i >= 100  انتقل إلى المستوى 2  <<في L2>> 

والآن، دعونا نلقي نظرة على النسخة المُحسّنة:

 i := 0 إذا كانت قيمة i أكبر من أو تساوي 100، فانتقل إلى المستوى L2 L1: a[i] := 0 i := i + 1 إذا كانت قيمة i أقل من 100، فانتقل إلى L1 المستوى الثاني:

مرة أخرى، دعونا نلقي نظرة على التعليمات التي يتم تنفيذها إذا تم تهيئة المتغير i إلى 100:

 إذا كان i >= 100  انتقل إلى المستوى 2 

لم نُهدر أي دورات معالجة مقارنةً بالإصدار الأصلي. والآن، لننظر في الحالة التي تم فيها زيادة قيمة i :

 إذا كانت قيمة i أقل من 100  انتقل إلى L1  a[i] := 0  i := i + 1  إذا كانت قيمة i أقل من 100  <<في L2>> 

كما ترون، تم حذف أمرين من نوع goto (وبالتالي، توقفين في خط الأنابيب) أثناء التنفيذ.

مراجع