Генерация высококачественного кода для программ, написанных на СИ | страница 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--------------------------------------------------------------