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

на главную

Жанры

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

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

Шрифт:

Вынесение инвариантного кода может быть потенциальным источником ошибок. В цикле

int a[10], x, y;

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

if( y != 0 )

a[i] = x / y;

оптимизирующий компилятор может определить, что выражение x/y есть инвариант, и вынесет его за пределы цикла, игнорируя проверку на 0 и создавая возможность возникновения ситуации деления на 0.

Когда компилятор выполняет удаление переменных индукции цикла он может непреднамеренно породить ситуацию переполнения,

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

T1 = j + k;

for(x = 0; x < T1 * v; x += T1);

В этом случае, поскольку значения j, k и v неизвестны, существует возможность переполнения для выражения T1 * v. Цикл может не закончиться.

Тестирование компиляторов

PC Tech Journal разработал тест оптимизации Си (см. листинг 1) как подспорье в оценке оптимизационных возможностей компиляторов Си. Тест проверяет степень оптимизации, проводимой компилятором. Для обеспечения основы для сравнения измерений времени выполнения для каждого компилятора запускался тест исполнения PC Tech Journal с ключами, разрешающими оптимизацию. Результаты его работы для каждого компилятора суммируются в таблице 1. Рисунок 6 демонстрирует опции оптимизации для каждого компилятора, которые использовались при компиляции обоих тестов. Характеристики выполнения программ можно сравнить с измерениями без оптимизации, приведенными в февральском номере за 1988 год (см. стр. 62 и 80).

Целью обоих тестов, исполнения и оптимизации, было получить наиболее быстрый код, который может дать каждый компилятор. Если компилятор предоставляет опции для генерации кода, они выбирались с приоритетом времени выполнения над размером программного кода, генерировались команды микропроцессора 80286 и непосредственные команды сопроцессора 80287, запрещалось проверять переполнение стека. Таким образом, минимальная конфигурация системы, требуемая для запуска тестов в том виде, в каком они компилировались, - машина с процессором 80286 и математическим сопроцессором 80287.

Многие компиляторы также имеют опции для генерации кода процессоров 80186 и NEC V20/V30, которые могут использоваться для машин класса XT (см. "Chips in transitions", Bob Smith, апрель 1986г., стр. 56). Эти процессоры имеют большинство средств 80286, исключая команды защищенного режима, так что сгенерированный для них код совпадает с кодом для 80286.

– ---------------------------------------------------¬

¦РИСУНОК 6: Командные строки ¦

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

¦ ¦

¦ BORLAND TURBO C 1.5 ¦

¦ : tcc -1 -f87 -N- -S -O -G -Z -r optbench.c ¦

¦ ¦

¦ COMPUTER INNOVATIONS C86PLUS 1.10 ¦

¦ : cc -DNO_ZERO_DIVIDE=1 -c -FPi87 -Oatx ¦

¦ -G2 -Fa optbench.c ¦

¦ ¦

¦ DATALIGHT OPTIMUM-C 3.14 ¦

¦ : dlc1 optbench.c -f-g ¦

¦ dlg optbench.tmp +vbe +all ¦

¦ dlc2 optbench.tmo ¦

¦ ¦

¦ LATTICE MS-DOS C 3.2 ¦

¦ : lc -d -k2 -f -v optbench.c ¦

¦ ¦

¦ MANX AZTEC C86 4.0 ¦

¦ : cc -A +A -B -T +F +2 +ef optbench.c ¦

¦ ¦

¦ METAWARE HIGH C 1.4 ¦

¦ : hc optbench.c -def NO_ZERO_DIVIDE=1 ¦

¦ pragma Off(Check_stack, Check_subscript) ¦

¦ pragma On(286, asm, auto_reg_alloc) ¦

¦ pragma On(floating_point, optimize_xjmp) ¦

¦ pragma On(optimize_xjmp_space, use_reg_vars) ¦

¦ ¦

¦ MICROSOFT C 5.0 ¦

¦ : cl -DNO_ZERO_DIVIDE=1 -c -G2 -Fc ¦

¦ -Ox optbench.c ¦

¦ ¦

¦ MICROSOFT QUICKC 1.0 ¦

¦ : qcl -c -G2 -FPi87 -Ox d:\optbench.c ¦

¦ ¦

¦ WATCOM C 6.0 ¦

¦ : wcc d:\optbench.c /d1 /oilt /s /2 /7 ¦

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

¦ Выполняемый код для тестов оптимизации и ¦

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

¦ генерировался с помощью этих командных строк с ¦

¦ указанными директивами компиляторов. ¦

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

Результаты теста исполнения для каждого компилятора в малой и большой моделях памяти приводятся в таблице 1. Тесты в наборе теста исполнения организованы в функции, которые вызывались из главной управляющей процедуры. Весь набор был скомпилирован и отредактирован в один файл EXE. Некоторые из процедур теста выполняются так быстро, что единственный вызов функции невозможно точно измерить. В этих случаях функции вызываются из управляющей процедуры многократно, чтобы увеличить время выполнения для получения возможности количественных измерений. В таблице 1 приводится количество итераций для каждого теста.

– -------------------------------------------------------------¬

¦Таблица 1: Результаты оптимизированного теста выполнения ¦

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

¦ COMPUTER ¦

¦ BORLAND INNOVATIONS DATALIGHT ¦

+----------------------T------------T------------T------------+

¦КОМПИЛЯТОР ¦ Turbo C ¦ C86Plus ¦ Optimum-C ¦

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

¦ВЕРСИЯ ¦ 1.5 ¦ 1.10 ¦ 3.14 ¦

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

¦ЦЕНА ¦ $99.95 ¦ $497 ¦ $139 ¦

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

¦РАЗМЕР ПРГРАММЫ(KB) ¦ 35/40 ¦ 30/38 ¦ 33/40 ¦

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

¦ОБЩИЕ ОПЕРАЦИИ (*) ¦ ¦ ¦ ¦

¦Вызовы функций ¦ 6.0/7.2 ¦ 7.6/8.2 ¦ 6.0/7.6 ¦

¦Целочисл. арифметика ¦ 7.0/7.0 ¦ 8.5/8.5 ¦ 6.3/6.3 ¦

¦Арифм-ка длинных целых¦ 29.0/29.0 ¦ 23.4/23.9 ¦ 26.3/26.9 ¦

¦Индексация ¦ 7.9/9.9 ¦ 7.9/11.4 ¦ 5.9/7.9 ¦

¦Использ-е указателей ¦ 6.2/15.3 ¦ 12.9/19.2 ¦ 6.8/15.3 ¦

¦ С регистровыми ¦ ¦ ¦ ¦

¦ переменными ¦ 6.8/15.2 ¦ 10.3/19.8 ¦ 6.8/15.3 ¦

¦Решето (Sieve) ¦ 5.0/5.0 ¦ 5.8/5.8 ¦ 4.3/3.8 ¦

¦ С регистровыми ¦ ¦ ¦ ¦

¦ переменными ¦ 6.4/6.5 ¦ 4.6/4.6 ¦ 4.3/3.8 ¦

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

¦ОПЕРАЦИИ С ФАЙЛАМИ ¦ ¦ ¦ ¦

¦Чтение и запись (**) ¦ ¦ ¦ ¦

¦ С дискеты на дискету¦ 8.2/8.2 ¦ 8.3/8.3 ¦ 8.3/8.2 ¦

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

Мастер Разума III

Кронос Александр
3. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.25
рейтинг книги
Мастер Разума III

Часовое имя

Щерба Наталья Васильевна
4. Часодеи
Детские:
детская фантастика
9.56
рейтинг книги
Часовое имя

Печать мастера

Лисина Александра
6. Гибрид
Фантастика:
попаданцы
технофэнтези
аниме
фэнтези
6.00
рейтинг книги
Печать мастера

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

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

Кротовский, не начинайте

Парсиев Дмитрий
2. РОС: Изнанка Империи
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Кротовский, не начинайте

Эволюция мага

Лисина Александра
2. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эволюция мага

Прорвемся, опера! Книга 3

Киров Никита
3. Опер
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прорвемся, опера! Книга 3

Демон

Парсиев Дмитрий
2. История одного эволюционера
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Демон

Прорвемся, опера! Книга 2

Киров Никита
2. Опер
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прорвемся, опера! Книга 2

#Бояръ-Аниме. Газлайтер. Том 11

Володин Григорий Григорьевич
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11

Офицер

Земляной Андрей Борисович
1. Офицер
Фантастика:
боевая фантастика
7.21
рейтинг книги
Офицер

Призыватель нулевого ранга. Том 3

Дубов Дмитрий
3. Эпоха Гардара
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Призыватель нулевого ранга. Том 3

Сделай это со мной снова

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

Злыднев Мир. Дилогия

Чекрыгин Егор
Злыднев мир
Фантастика:
фэнтези
7.67
рейтинг книги
Злыднев Мир. Дилогия