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



¦ были определены заранее компилятором, а не позже, во ¦

¦ время выполнения. ¦

L--------------------------------------------------------------

"Вынесение инвариантного (неизменяющегося) кода" - один из путей ускорения циклов, заключающийся в вынесении выражений за пределы цикла, если значения, ими вычисляемые, являются неизменными во время выполнения цикла. Если инвариантный код выносится из следующего цикла:

>unsigned char i,j,k,v,x;

>for( i = 0; i < v; i++)

> x = i * (j+k);

его логический эквивалент будет:

>T1 = j + k;

>for(i = 0; i < v; i++)

> x = i * T1;

 

--------------------------------------------------------------¬

¦РИСУНОК 3: Вынесение инвариантного кода - Microsofr C 5.0 ¦

+-------------------------------------------------------------+

¦Исходный текст на Си MICROSOFT COMPUTER INNOVATIONS ¦

¦ C 5.0 C86Plus 1.10 ¦

+-------------------------------------------------------------+

¦for(i4=0;i4<=2;i4++) sub SI,SI mov i4,0 ¦

¦ ivector2[i4] =j*k; mov AX,j jmp L44@2 ¦

¦ imul k L9@2: ¦

¦ mov [BP-4],AL mov AX,j ¦

¦ $L20007: imul k ¦

¦ mov AL,[BP-4] mov SI,i4 ¦

¦ mov ivector2[SI],AL ¦

¦ inc SI mov ivector2[SI],AL¦

¦ cmp SI,2 inc i4 ¦

¦ jle $L20007 L44@2: ¦

¦ mov i4,SI cmp i4,2 ¦

¦ jle L9@2 ¦

+-------------------------------------------------------------+

¦ Вынесение инвариантного кода уменьшает время выполнения ¦

¦ цикла путем вынесения неизменяющихся выражений из тела ¦

¦ цикла. В отличие от Computer Innovations C86Plus 1.10, ¦

¦ компилятор Microsoft C 5.0 успешно выносит выражение j * h ¦

¦ за пределы цикла, так что оно выполняется только один раз, ¦

¦ вместо того, чтобы выполняться на каждой итерации цикла. ¦

L--------------------------------------------------------------