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

Меня интересует оптимизация во время выполнения виртуальной машиной и во время компиляции. У меня была идея, что оптимизации наиболее эффективны и просты во время компиляции.

Однако моя мысль кажется ложной при определенных обстоятельствах. Это очевидно в заявлении Стива Йегги, цитируемом Даниэлем

[O] ptimization часто легче, когда выполняется во время выполнения умным виртуальная машина - -.

Почему оптимизация легче выполняется во время выполнения виртуальной машиной, чем во время компиляции?

Ответы [ 7 ]

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

Краткий ответ: Поскольку во время выполнения легче определить и проанализировать горячие точки - части вашей программы, которые используют больше всего времени.

Длинный ответ:

Если вы начнете выполнять код в интерпретируемом режиме, виртуальная машина сможет подсчитать, как часто и как долго используются разные части кода. Эти части можно оптимизировать лучше.

Возьмите вложенные предложения if-then-else- Меньшее число логических проверок требует меньшего времени выполнения. Если вы оптимизируете путь для части, которая выполняется чаще, вы можете улучшить общее время выполнения.

Другой момент заключается в том, что во время выполнения вы можете делать предположения, которые невозможны во время компиляции. Например, Java-VM встроена в виртуальные методы серверного режима - если загружен только один класс, который реализует этот метод. Это было бы небезопасно, если бы это было сделано во время компиляции. JVM снова деоптимизирует код, если загружается другой класс, но часто этого не происходит.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Эти вещи позволяют вам выполнять оптимизацию во время выполнения, которую вы просто не можете сделать во время компиляции.

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

Следует признать, что не концепция виртуальной машины позволяет оптимизировать среду выполнения, а тот факт, что многие виртуальные машины не отбрасывают исходные метаданные программы и имеют встроенные функции для отражения. Более подходящим термином для использования будет «библиотека времени выполнения», которая может лучше оптимизировать, чем статическая оптимизация; это относится к языкам не-VM, таким как C.

...