Jump to content

Инверсия цикла

В информатике содержащим инверсия цикла — это оптимизация компилятора и преобразование цикла , при котором цикл while заменяется блоком if, цикл do.. while . При правильном использовании это может повысить производительность за счет конвейеризации инструкций .

Пример на языке C

[ редактировать ]
  int   я  ,   а  [  100  ];    я   =   0  ;    в то время как   (  я   <   100  )   {      а  [  я  ]   знак равно   0  ;      я  ++  ;    } 

эквивалентно:

  int   я  ,   а  [  100  ];    я   =   0  ;    если   (  я   <   100  )   {      do   {        а  [  я  ]   знак равно   0  ;        я  ++  ;      }   Пока   (  я   <   100  );    } 

Несмотря на кажущуюся большую сложность второго примера, на современных процессорах он может работать быстрее, поскольку они используют конвейер команд . По своей природе любой скачок в коде вызывает остановку конвейера , что снижает производительность.

Кроме того, инверсия цикла обеспечивает безопасное перемещение кода, не зависящее от цикла .

Пример в трехадресном коде

[ редактировать ]
 я := 0 L1: если я >= 100, переходим к L2      а[я] := 0      я := я + 1      перейти к L1 Л2:   

Если бы я был инициализирован со значением 100, инструкции, выполняемые во время выполнения, были бы:

 если я >= 100  перейти к L2 

Предположим, что i был инициализирован некоторым значением меньше 100. Теперь давайте посмотрим на инструкции, выполняемые в момент после того, как i было увеличено до 99 в цикле:

 перейти к L1  если я < 100  а[я] := 0  я := я + 1  перейти к L1  если я >= 100  перейти к L2  <<на L2>> 

Теперь давайте посмотрим на оптимизированную версию:

 я := 0      если я >= 100, переходим к L2 L1: а[я] := 0      я := я + 1      если я < 100, перейдите к L1 Л2: 

Опять же, давайте посмотрим на инструкции, выполняемые, если i инициализировано значением 100:

 если я >= 100  перейти к L2 

Мы не потратили ни одного цикла по сравнению с исходной версией. Теперь рассмотрим случай, когда i было увеличено до 99:

 если я < 100  перейти к L1  а[я] := 0  я := я + 1  если я < 100  <<на L2>> 

Как видите, два перехода при выполнении были исключены (и, следовательно, две остановки конвейера).

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: d2f5da7f9d56c3bf60cbd69fbe462c3e__1714887660
URL1:https://arc.ask3.ru/arc/aa/d2/3e/d2f5da7f9d56c3bf60cbd69fbe462c3e.html
Заголовок, (Title) документа по адресу, URL1:
Loop inversion - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)