"Филипп Н.Хислей. Генерация высококачественного кода для программ, написанных на СИ " - читать интересную книгу автора | idiv SI test DI,DI |
| mov DI,AX jg L4 | | or CX,CX | | jg $0265 | | mov i5,DI | +-------------------------------+ | Компилятор Microsoft C 5.0 выполнил снижение мощности на | | константном выражении и разместил в регистрах все | | переменные внутри простого цикла, включая вычисляемое | | значение i5. Высокая степень проведенного анализа цикла | | демонстрируется тем, что заключительные состояния k5 и j5 | | были определены заранее компилятором, а не позже, во | | время выполнения. | 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 | | за пределы цикла, так что оно выполняется только один раз, | |
|
|