4

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

Однако в некоторых случаях моя мысль кажется ложной. Это очевидно в Steve Yeggie's statement quoted by Daniel

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

Почему оптимизация проще при выполнении VM во время выполнения, чем во время компиляции?

+2

Я думаю, что Стив Йегги имел в виду «легче получить лучшие результаты», а не «легче сделать», так я думаю, что вы его интерпретируете. В конце концов, я полагаю, что перестановка программы сложнее, чем во время компиляции. – Pod

ответ

4

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

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

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

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

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

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

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

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

+2

«Вы можете делать каждую оптимизацию во время выполнения, которая возможна во время компиляции» - я не верю в это. Оптимизатор, управляемый профилем, может изменять порядок элементов данных в объекте, например. улучшить локальность ссылки или переместить наиболее используемый объект на смещение 0. Это почти невозможно, если у вас уже есть реальные объекты в памяти. – MSalters

+0

Современные сборщики мусора постоянно изменяют объекты в памяти, чтобы уменьшить фрагментацию. Для этого все ссылки/указатели должны быть переписаны (или используется некоторая умная косвенность). В этом контексте преобразование данных не кажется таким сложным. Но я должен признать, что я не знаю пример виртуальной машины, которая делает это на самом деле. – Mnementh

+2

На самом деле это очень просто, особенно потому, что виртуальная машина, использующая сбор мусора маркировки, будет проходить по всему дереву объектов на регулярной основе. И снова побеждает runtime, потому что вы видите, какие поля действительно доступны вместе, на регулярной основе, по сравнению с одним методом, который редко называется. (примечание: я понятия не имею, действительно ли виртуальные виртуальные или Java-виртуальные машины делают это, и лично сомневаюсь, что они это делают) – kdgregory

1

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

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

2

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

+1

Yup - компиляторы вообще не могут использовать SSE3, например. – MSalters

2

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

1

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

1

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

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

0

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

Смежные вопросы