Чтение онлайн

на главную - закладки

Жанры

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

Хислей Филипп Н.

Шрифт:

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. Функции из этого набора называются встроенными. Эта оптимизация полезна для внутренних циклов, которые выполняются многократно. Набор доступных встроенных функций зависит от компилятора.

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

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

Оптимизировать или нет?

Оптимизация - не панацея, и ее применение не бесплатно. В зависимости от степени оптимизации время, требуемое для компиляции программы, может значительно возрастать. Для небольших программ требуемое время можно не принимать во внимание, но для больших оно может иметь значение.

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

Поделиться:
Популярные книги

Адвокат Империи 3

Карелин Сергей Витальевич
3. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 3

Кротовский, может, хватит?

Парсиев Дмитрий
3. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
аниме
7.50
рейтинг книги
Кротовский, может, хватит?

Дурная жена неверного дракона

Ганова Алиса
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Дурная жена неверного дракона

Вонгозеро

Вагнер Яна
1. Вонгозеро
Детективы:
триллеры
9.19
рейтинг книги
Вонгозеро

Ведьма Вильхельма

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
8.67
рейтинг книги
Ведьма Вильхельма

Папина дочка

Рам Янка
4. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Папина дочка

Законы Рода. Том 6

Flow Ascold
6. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 6

Как я строил магическую империю 7

Зубов Константин
7. Как я строил магическую империю
Фантастика:
попаданцы
постапокалипсис
аниме
фантастика: прочее
5.00
рейтинг книги
Как я строил магическую империю 7

Лучший из худший 3

Дашко Дмитрий
3. Лучший из худших
Фантастика:
городское фэнтези
попаданцы
аниме
6.00
рейтинг книги
Лучший из худший 3

Штурмовик из будущего 3

Политов Дмитрий Валерьевич
3. Небо в огне
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Штурмовик из будущего 3

Последний попаданец 2

Зубов Константин
2. Последний попаданец
Фантастика:
юмористическая фантастика
попаданцы
рпг
7.50
рейтинг книги
Последний попаданец 2

Идеальный мир для Лекаря 14

Сапфир Олег
14. Лекарь
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 14

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Вдова на выданье

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Вдова на выданье