Döngü ters çevirme - Loop inversion

İçinde bilgisayar Bilimi, döngü ters çevirme bir derleyici optimizasyonu ve döngü dönüşümü içinde bir döngü sırasında ile değiştirilir eğer blok içeren do.. while döngüsü. Doğru kullanıldığında performansı artırabilir. talimat ardışık düzeni.

C'deki örnek

  int ben, a[100];  ben = 0;  süre (ben < 100) {    a[ben] = 0;    ben++;  }

eşdeğerdir:

  int ben, a[100];  ben = 0;  Eğer (ben < 100) {    yapmak {      a[ben] = 0;      ben++;    } süre (ben < 100);  }

İkinci örneğin görünüşte daha karmaşık olmasına rağmen, aslında modern modellerde daha hızlı çalışabilir. CPU'lar çünkü kullanıyorlar talimat boru hattı. Doğası gereği, koddaki herhangi bir sıçrama bir boru hattı durağı, bu performansa zarar verir.

Ek olarak, döngü ters çevirme güvenliğe izin verir döngü ile değişmeyen kod hareketi.

Üç adresli kod örneği

      i: = 0 L1: eğer i> = 100 goto L2 a [i]: = 0 i: = i + 1 goto L1 L2: 

Eğer ben 100'de başlatılmış olsaydı, çalışma zamanında yürütülen talimatlar şöyle olurdu:

1   eğer i> = 1002   git L2

Farz edelim ki ben 100'den küçük bir değere başlatılmıştı. Şimdi şu anda yürütülen talimatlara bakalım. ben döngüde 99'a yükseltildi:

1   git L12   eğer <1003   a [i]: = 04   i: = i + 15   git L16   eğer i> = 1007   git L28   <<at L2>>

Şimdi, optimize edilmiş sürüme bakalım:

      i: = 0 eğer i> = 100 ise L2 L1: a [i]: = 0 i: = i + 1 eğer i <100 goto L1 L2:

Yine, aşağıdaki durumlarda yürütülen talimatlara bakalım. ben 100 olarak başlatıldı:

1   eğer i> = 1002   git L2

Orijinal versiyona kıyasla herhangi bir döngüyü boşa harcamadık. Şimdi durumu düşünün nerede ben 99'a yükseltildi:

1   eğer <1002   git L13   a [i]: = 04   i: = i + 15   eğer <1006   <<at L2>>

Gördüğünüz gibi iki gits (ve dolayısıyla iki boru hattı durağı) yürütmede ortadan kaldırıldı.