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

Шрифт
Интервал

Хотя все девять рассматриваемых компиляторов генерируют приемлемый код, три из них, - Datalight Optimum-C, Microsoft C 5.0 и WATCOM C 6.0, - выполняют оптимизацию кода более высокого уровня, чем остальные.

Компилятор Datalight Optimum-C - это быстрый и выразительный исполнитель. Он выполняет обширный анализ потоков данных и оптимизирует код, за который другие компиляторы не берутся.

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

Компилятор WATCOM C 6.0 соперничает с Microsoft C 5.0 по степени выполняемой оптимизации и генерирует наиболее быстрый код в тесте оптимизации. То, что WATCOM теряет на не самых оптимальных циклах, он более чем наверстывает в малых заголовках вызова функций. WATCOM C 6.0 хорошо использует регистры, минимизирует обращения к памяти и повышает эффективность выполнения программ.

Компиляторы Metaware High C и Computer Innovations C86Plus выполняют более-менее удовлетворительную степень оптимизации, но отступают на второй план при рассмотрении усовершенствований, сделанных в технологии компиляторов фирмами Datalight, Microsoft и WATCOM.

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

ЛИСТИНГ 1: OPTBENCH.C

/* ---------------------------------------------------------- *

¦ ¦

¦ Серия тестов PC Tech Journal ¦

¦ Тест оптимизации кода Си ¦

¦ ¦

¦ Copyright (c) 1988 Ziff-Devis Publishing Company ¦

¦ ¦

¦ Эта программа-тест была разработана для проверки ¦

¦ методов оптимизации кода, применяемых компилятором ¦

¦ Си. Она не вырабатывает разумные результаты и не ¦

¦ представляет хороший стиль программирования. ¦

¦ ¦

* ---------------------------------------------------------- */

>#include

>#include

>#define max_vector 2

>#define constant5 5

>typedef unsigned char uchar;

>int i, j, k, l, m;

>int i2, j2, k2;

>int g3, h3, i3, k3, m3;

>int i4, j4;

>int i5, j5, k5;

>double flt_1, flt_2, flt_3, flt_4, flt_5, flt_6;

>int ivector[ 3 ];

>uchar ivector2[ 3 ];

>short ivector4[ 6 ];

>int ivector5[ 100 ];

>#ifndef NO_PROTOTYPES

>void dead_code( int, char * );

>void unnecessary_loop( void );

>void loop_jamming( int );

>void loop_unrolling( int );

>int jump_compression( int, int, int, int, int );

>#else

>void dead_code();

>void unnecessary_loop();

>void loop_jamming();

>void loop_unrolling();

>int jump_compression();

>#endif

>int main( argc, argv ) /* optbench */

> int argc;

> char **argv;

> {

>/* ---------------------------- *

¦ Размножение констант и копий ¦

*------------------------------*/

> j4 = 2;

> if( i2 < j4 && i4 < j4 )

> i2 = 2;

> j4 = k5;

> if( i2 < j4 && i4 < j4 )

> i5 = 3;

>/* ------------------------------------------ *

¦ Свертка констант, арифметические тождества ¦

¦ и излишние операции загрузки/сохранения ¦

* ------------------------------------------ */

> i3 = 1 + 2;

> flt_1 = 2.4 + 6.3;

> i2 = 5;

> j2 = i + 0;

> k2 = i / 1;

> i4 = i * 1;

> i5 = i * 0;

>#ifndef NO_ZERO_DIVIDE

>/*

* Некоторые компиляторы распознают ошибку

* деления на нуль и не генерируют объектный код

*/

> i2 = i / 0;

> flt_2 = flt_1 / 0.0;

>#else

> printf( "This compiler handles divide-by-zero as \

> an error\n>");

>#endif

> flt_3 = 2.4 / 1.0;

> flt_4 = 1.0 + 0.0000001;

> flt_5 = flt_6 * 0.0;

> flt_6 = flt_2 * flt_3;

>/* -------------------- *

¦ Лишнее присваивание ¦

* -------------------- */

> k3 = 1;

> k3 = 1;

>/* ------------------ *

¦ Снижение мощности ¦

* ------------------ */

> k2 = 4 * j5;

> for( i = 0; i <= 5; i++ )

> ivector4[ i ] = i * 2;

>/* ------------- *

¦ Простой цикл ¦

* ------------- */

> j5 = 0;

> k5 = 10000;

> do {

> k5 = k5 - 1;

> j5 = j5 + 1;

> i5 = (k5 * 3) / (j5 * constant5);

> } while ( k5 > 0 );

>/* -------------------------------------- *

¦ Управление переменной индукции цикла ¦

* -------------------------------------- */

> for( i = 0; i < 100; i++ )

> ivector5[ i * 2 + 3 ] = 5;

>/* ----------------------- *

¦ Глубокие подвыражения ¦

* ----------------------- */

> if( i < 10 )

> j5 = i5 + i2;


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.