ВУЗ:
Составители:
Примером инварианта цикла является вычисление выражения 2*j. Результат вычисления этого вы-
ражения зависит только от операнда j, значение которого не изменяется во время выполнения цикла.
Таким образом, мы можем поместить четверку 5 непосредственно перед началом выполнения цикла.
Аналогичные соображения – относительно четверок 6 и 7.
1) * #2 j i3 вычисление
инвариантов
2) – i3 #1 i4
3) – i4 #1 i5
4) : = #1 i инициализация
цикла
5)
>
i #10 (14)
6) – i #1 i1 вычисление
индексов для х
7) * i1 #10 i2
8) + i2 i5 i6
9) + i2 i4 i12 вычисление
индексов для y
10) : = y[i12] x[i6] операция
присваивания
11) + #1 i i14 конец цикла
12) : = i14 i
13) GOTO (5)
14) … следующая
операция
Рис. 19
Примечание: необходимо выполнить 94 операции.
В результате получим новую последовательность четверок (рис. 19). Общее количество четверок
остается тем же, но количество четверок в цикле уменьшилось с 12 до 9. Каждое выполнение предло-
жения FOR вызывает десятикратное повторение тела цикла. Это означает, что общее количество опера-
ций, необходимых для выполнения FOR, сократилось со 121 до 94.
Общее количество операций, приходящееся на одно выполнение предложения FOR, по сравнению с
начальным вариантом, сократилось со 161 до 94, что существенно уменьшило выполнение программы.
Существуют также и более тонкие методы обработки общих подвыражений и инвариантов цикла,
чем описанные выше. Можно ожидать, что благодаря этим методам может быть получен еще более оп-
тимизированный вариант кода.
Страницы
- « первая
- ‹ предыдущая
- …
- 29
- 30
- 31
- 32
- 33
- …
- следующая ›
- последняя »