Генерация высококачественного кода для программ, написанных на СИ | страница 10



Рис. 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 удаляет ее благодаря ¦