Невозможно понять основные оптимизации компиляторов - PullRequest
1 голос
/ 26 июня 2009

Мартинус дает хороший пример кода, где компилятор оптимизирует код во время выполнения путем вычисления умножения:

код Мартина

int x = 0;
for (int i = 0; i < 100 * 1000 * 1000 * 1000; ++i) {
    x += x + x + x + x + x;
}
System.out.println(x);

Его код после оптимизации компилятора Constant Folding во время компиляции ( Спасибо Абеленки за указание на это )

int x = 0;
for (int i = 0; i < 100000000000; ++i) {
    x += x + x + x + x + x;
}
System.out.println(x);

Эта техника оптимизации, на мой взгляд, тривиальна. Я полагаю, что это может быть одна из техник, которые Sun недавно начала использовать тривиально.

Меня интересуют два типа оптимизации, сделанные компиляторами :

  1. оптимизации, которые были опущены в современных компиляторах, как тривиальные, такие как в компиляторе Java во время выполнения
  2. оптимизаций, которые используются большинством современных компиляторов

Пожалуйста, поместите каждую технику оптимизации в отдельный ответ.

Какими методами пользовались компиляторы в 90-х годах (1) и сегодня (2)?

Ответы [ 4 ]

4 голосов
/ 26 июня 2009

Просто купите последнюю версию Книги Дракона.

1 голос
/ 26 июня 2009

Как насчет разворачивания цикла?:

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

Кому:

for (i = 0; i < 100; i += 2)
{
    g ();
    g ();
}

С http://www.compileroptimizations.com/. Их гораздо больше - слишком много, чтобы ответить на каждый прием.

Проверьте Деревья трассировки для классного переводчика / оптимизация точно в срок.

1 голос
/ 26 июня 2009

Оптимизация сжатия 100 *1000* 1000 * 1000 => 100000000000, показанная в вашем примере, НЕ является оптимизацией во время выполнения. Это происходит во время компиляции. (и я бы даже не назвал это оптимизацией)

Я не знаю каких-либо оптимизаций, происходящих во время выполнения, если не считать подсистемы виртуальных машин, которые имеют JIT (только во время) компиляцию.

Оптимизации, которые происходят во время компиляции, весьма разнообразны и зачастую не просты для объяснения. Но они могут включать в себя встроенные небольшие функции, реорганизацию инструкций для локальности кэша, реорганизацию инструкций для лучшей конвейеризации или гиперпоточности и многие, многие другие методы.

РЕДАКТИРОВАТЬ : Некоторые F * ER отредактировали мой пост ... и затем проголосовали против него. В моем первоначальном посте четко указывалось, что коллапсирующее умножение происходит в COMPILE TIME, а не в RUN TIME, как предположил автор. Затем я упомянул, что на самом деле свертывание констант не является большой оптимизацией. Препроцессор даже делает это.

Маси: если ты хочешь ответить на вопрос, то ответь на вопрос. НЕ редактируйте ответы других людей, чтобы вставить слова, которые они никогда не писали.

0 голосов
/ 26 июня 2009

Книги компиляторов должны быть довольно хорошим ресурсом.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...