Краткий ответ: Поскольку во время выполнения легче определить и проанализировать горячие точки - части вашей программы, которые используют больше всего времени.
Длинный ответ:
Если вы начнете выполнять код в интерпретируемом режиме, виртуальная машина сможет подсчитать, как часто и как долго используются разные части кода. Эти части можно оптимизировать лучше.
Возьмите вложенные предложения if-then-else- Меньшее число логических проверок требует меньшего времени выполнения. Если вы оптимизируете путь для части, которая выполняется чаще, вы можете улучшить общее время выполнения.
Другой момент заключается в том, что во время выполнения вы можете делать предположения, которые невозможны во время компиляции. Например, Java-VM встроена в виртуальные методы серверного режима - если загружен только один класс, который реализует этот метод. Это было бы небезопасно, если бы это было сделано во время компиляции. JVM снова деоптимизирует код, если загружается другой класс, но часто этого не происходит.
Также во время выполнения больше известно о машине, на которой запускается программа. Если у вас есть машина с большим количеством регистров, вы можете использовать их. Опять же, это не безопасно, если это делается во время компиляции.
Скажу одно: оптимизация во время выполнения также имеет недостатки. Самое главное: время оптимизации добавляется к времени выполнения программы. Также это сложнее, потому что вы должны скомпилировать части программы и выполнить их. Ошибки в виртуальной машине являются критическими. Подумайте о компиляторе, который иногда зависает - вы можете снова скомпилировать, и все в порядке. Если иногда происходит сбой виртуальной машины, это означает, что иногда происходит сбой вашей программы. Не хорошо.
В заключение: вы можете выполнять любую оптимизацию во время выполнения, которая возможна во время компиляции ... и некоторые другие. У вас есть больше информации о программе, ее путях выполнения и машине, на которой работает программа. Но вы должны учитывать время, необходимое для выполнения оптимизаций. Кроме того, это сложнее сделать во время выполнения, и ошибки более актуальны, чем во время компиляции.