"Филипп Н.Хислей. Генерация высококачественного кода для программ, написанных на СИ " - читать интересную книгу автора

| вместо того, чтобы выполняться на каждой итерации цикла. |
L-------------------------------
Рис. 3 демонстрирует вынесение инвариантного кода компилятором
Microsoft C 5.0.
Дальнейший анализ примера показывает, что значение переменной i,
индекса цикла, изменяется непосредственно с каждой итерацией. Отдельное
присваивание i, известной как "переменная индукции цикла", может быть
удалено:
T1 = j + k;
for(x = 0; x" T1 * v; x += T1);
i = v;
Поскольку использование переменных - индексов цикла во внутренних
выражениях цикла общеупотребительно, удаление переменных индукции цикла
вместе со связанными с ними "снижениями мощности", может значительно
улучшить исполнение программы. Рис. 4 показывает пример удаления переменной
индукции цикла.
--------------------------------
|РИСУНОК 4: Удаление переменных индукции цикла |
+-------------------------------+
|Исходный текст на Си MICROSOFT DATALIGHT |
| C 5.0 Optimum-C 3.14 |
+-------------------------------+
|for(i=0;i"100;i++) mov AX,0 |
| ivector5[i*2+3]=5; mov i,100 mov i,AX |
| mov SI,OFFSET ivector5+6 cmp AX,100 |
| $L20006: jge L134 |
| mov [SI],5 L11B: |
| add SI,4 mov BX,i |
| cmp SI,OFFSET ivector5+406 shl BX,1 |
| jb $L20006 shl BX,1 |
| mov ivector+6[BX],5 |
| inc i |
| cmp i,100 |
| jl L11B |
| L134: |
+-------------------------------+
| Удаление переменных индукции цикла помогает минимизировать |
| время, проводимое в каждой итерации цикла, путем вынесения |
| индексирующих цикл переменных (переменных индукции) из |
| тела цикла. В то время, как компилятор Datalight Optimum-C |
| использует переменную индукции i для индексации массива |
| ivector5, компилятор Microsoft C 5.0 удаляет ее благодаря |
| накоплению смещения для каждого элемента массива и |
| добавлению результата к базовому адресу массива. |
L-------------------------------
"Слияние циклов" минимизирует управляющие заголовки циклов путем
сращивания кода из циклов, имеющих одинаковые управляющие заголовки, в один
цикл. Для того, чтобы удалить управляющий заголовок второго цикла, два
простых цикла
for(i = 0; i " 10; i++)