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

Тут можно читать онлайн Филипп Хислей - Генерация высококачественного кода для программ, написанных на СИ - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Генерация высококачественного кода для программ, написанных на СИ
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    3.2/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 60
    • 1
    • 2
    • 3
    • 4
    • 5

Филипп Хислей - Генерация высококачественного кода для программ, написанных на СИ краткое содержание

Генерация высококачественного кода для программ, написанных на СИ - описание и краткое содержание, автор Филипп Хислей, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Генерация высококачественного кода для программ, написанных на СИ - читать онлайн бесплатно полную версию (весь текст целиком)

Генерация высококачественного кода для программ, написанных на СИ - читать книгу онлайн бесплатно, автор Филипп Хислей
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

¦ jl L11B ¦

¦ L134: ¦

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

¦ Удаление переменных индукции цикла помогает минимизировать ¦

¦ время, проводимое в каждой итерации цикла, путем вынесения ¦

¦ индексирующих цикл переменных (переменных индукции) из ¦

¦ тела цикла. В то время, как компилятор Datalight Optimum-C ¦

¦ использует переменную индукции i для индексации массива ¦

¦ ivector5, компилятор Microsoft C 5.0 удаляет ее благодаря ¦

¦ накоплению смещения для каждого элемента массива и ¦

¦ добавлению результата к базовому адресу массива. ¦

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

"Слияние циклов" минимизирует управляющие заголовки циклов путем сращивания кода из циклов, имеющих одинаковые управляющие заголовки, в один цикл. Для того, чтобы удалить управляющий заголовок второго цикла, два простых цикла

for(i = 0; i < 10; i++)

a = b + c;

for(i = 0; i < 10; i++)

d = e + f;

могут быть объединены в один цикл

for(i = 0; i < 10; i++) {

a = b + c;

d = e + f;

}

Поскольку для поддержки слияния циклов требуется процедурная оптимизация, в общем случае это действие не выполняется. Ни один из включенных в обзор компиляторов этот метод не применяет.

Непосредственно связано со слиянием циклов "разворачивание циклов", которое минимизирует количество проходов через цикл путем увеличения числа операций, выполняемых внутри каждой итерации. Цикл инициализации массива

int a[3];

int i;

for(i = 0; i < 3; i++)

a[i] = 0;

странслированный компилятором без оптимизации, может получить следующий эквивалент в языке ассемблера:

mov i,0

LOOP:

mov BX,i

shl BX,1

mov a[BX],0

inc i

cmp i,3

jl LOOP

В том же коде, оптимизированном по методу разворачивания цикла, удаляется цикл путем замещения его тремя инструкциями присваивания:

mov a,0

mov a+2,0

mov a+4,0

Хотя ни один из компиляторов, включенных в обзор, не выполняет буквальное разворачивание циклов, некоторые из них оптимизируют цикл путем использования "специализированных инструкций прцессора". Многие процессоры предоставляют специализированные инструкции для управления перемещением блоков данных, инициализации памяти и других часто встречающихся ситуаций управления данными. К примеру, строковые инструкции с префиксом повторения (в семействе процессоров 80x86), выполняющиеся быстрее, чем посимвольные команды в цикле. Оптимизирующий компилятор использует, когда возможно, инструкции процессора для управления ситуациями в специальных случаях. Применение специализированных инструкций процессора к расширенной версии предыдущего примера разворачивания циклов

int a[10000];

int i;

for(i = 0; i < 10000; i++)

a[i] = 0;

дает приведенный ниже ассемблерный код процессора 80x86. Он гораздо быстрее, чем его аналог, записанный в виде цикла или набора инструкций непосредственной засылки в память, имеющего соответствующую длину:

mov CX,10000

mov i,CX

sub AX,AX

mov DI,offset a

push DS

pop ES

cld

rep stosw

"Минимизация заголовков вызова функций" может существенно уменьшить время выполнения в структурированной программе. При вызове функции параметры передаются вызываемой подпрограмме в стеке, находящемся в оперативной памяти. Набор инструкций некоторых процессоров содержит инструкции, которые поддерживают потребности Си и других структурированных языков высокого уровня в установке адресации фрейма стека перед выполнением кода функции и восстановлении стекового фрейма перед завершением.

Начиная с процессора Intel 80186, семейство микропроцессоров 80x86 предоставляет инструкции ENTER и LEAVE для обработки вызовов функций. Полезность инструкции ENTER снижается, так как ее выполнение занимает гораздо больше временных циклов процессора, чем выполнение последовательности команд, осуществляющих засылку в стек базового указателя и вычитание необходимого количества байт для фрейма из указателя стека.

Альтернативой использованию стека для передачи параметров функции является задание корректно определенного протокола для передачи стольких параметров, сколько возможно, в регистрах. Если доступно достаточное количество регистров чтобы передать все параметры функции, и вызываемая функция не использует локальные переменные, то отпадает необходимость генерации кода для пролога и эпилога функции (они обычно нужны для установки адресации фрейма стека). Компилятор WATCOM C 6.0 использует этот подход (см. рис. 5). Существенное приращение скорости получается потому, что не только удаляются инструкции, но и потому, что параметры уже регистровые и могут обрабатываться более эффективно.

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

¦РИСУНОК 5: Строение заголовка вызова функции ¦

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

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

¦(x)-врем. циклы C 5.0 C 6.0 ¦

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

¦ /*Тест вызова funcall funcall ¦

¦ функции */ push bp push DX ¦

¦int funcall() mov BP,SP xor DX,DX ¦

¦{ sub SP,2 L4 mov AX,DX <-¬ ¦

¦ int i; push SI call dummy ¦ ¦

¦ sub SI,SI inc DX (23)¦

¦ for(i=0;i<20000;i++) $L20008: cmp DX,2000 ¦ ¦

¦ { dummy(i); } ; push SI <-¬ jl L4 <-- ¦

¦} call dummy ¦ pop DX ¦

¦ add SP,2 (31) ret ¦

¦int dummy(i) inc SI ¦ ¦

¦int i; cmp SI,20000 ¦ ¦

¦{ jl $L20008 <-- ¦

¦ return (i+1); mov [BP-2],SI ¦

¦} pop SI ¦

¦ leave ¦

¦ ret ¦

¦ ¦

¦ --> dummy push BP dummy inc AX <-¬(13)¦

¦ ¦ mov BP,SP ret <-- ¦

¦ (28)¦ mov AX,[BP+4] ¦

¦ ¦ inc AX ¦

¦ ¦ leave ¦

¦ L-> ret ¦

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

¦ Подобно большинству компиляторов Си Microsoft C 5.0 ¦

¦ передает параметры функциям путем засылки их в стек. ¦

¦ Всякий раз при вызове выполняется заголовок, так как ¦

¦ функция должна установить адресацию базирующихся на стеке ¦

¦ параметров. Однако компилятор WATCOM C 6.0 удаляет ¦

¦ стековый заголовок благодаря передаче в регистрах стольких ¦

¦ параметров, сколько возможно. ¦

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

Большинство компиляторов Си позволяют пользователю указывать, какой набор команд процессора должен использоваться при генерации кода. Хотя специализированные инструкции конкретного процессора и могут ускорить выполнение программы, но их применение может ограничить количество машин, на которых программа может работать.

В случае, когда скорость является критическим параметром, "замена вызова функции ее телом" может помочь в удалении заголовков вызова функций. Некоторые компиляторы предоставляют возможность заменять операторами вызовы функций из некоторого набора, либо генерировать их вызовы. Набор таких функций содержит некоторые общеупотребительные функции, такие как abs. Функции из этого набора называются встроенными. Эта оптимизация полезна для внутренних циклов, которые выполняются многократно. Набор доступных встроенных функций зависит от компилятора.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Филипп Хислей читать все книги автора по порядку

Филипп Хислей - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге Генерация высококачественного кода для программ, написанных на СИ, автор: Филипп Хислей. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x