"Филипп Н.Хислей. Генерация высококачественного кода для программ, написанных на СИ " - читать интересную книгу автора | вместо того, чтобы выполняться на каждой итерации цикла. |
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 | | 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++) |
|
|