какой статический компилятор может оптимизировать, когда JIT не может? - PullRequest
3 голосов
/ 13 декабря 2010

Есть ли примеры того, что статический компилятор может оптимизировать, когда JIT не может?

Например, какая-то оптимизация компилятора C ++, которая не может быть выполнена с помощью .NET JIT?

Ответы [ 5 ]

9 голосов
/ 13 декабря 2010

Отсутствует.Доказательство: возьмите любой компилятор и используйте его как JIT.КЭД.

Однако , JIT ограничен во времени выполнения, поэтому здесь недопустимо проводить сложные оптимизации.

2 голосов
/ 13 декабря 2010

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

Одним из ограничений в дрожании является то, что он не может тратить много времени на анализ кода. Каждые миллисекунды, которые он записывает, влияют на скорость реакции программы. Две стратегии помогают. Сборки могут быть предварительно объединены с помощью ngen.exe, все сборки .NET есть, и разумно сделать то же самое с вашими собственными сборками. До тех пор, пока они «большие», на сбор кода может уйти меньше времени, чем на поиск и загрузку файла .ni.dll на диск.

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

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

Типичное число, о котором идет речь, состоит в том, что машинный код с джитами на 85% эффективнее исходного скомпилированного кода. Предположим, что с несколькими большими кусками соли качество и характер исходного кода всегда на первом месте.

1 голос
/ 13 декабря 2010

Основной проблемой здесь является время выполнения и ресурсы.Сборка Visual Studio занимает 61 час, и я даже не знаю, какая у них машина для сборки.Однако JIT должны работать с долей реальных ресурсов машины и в миллисекундах.Там нет никакого способа, которым они могли бы оптимизировать так сильно.

1 голос
/ 13 декабря 2010

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


С другой стороны, современный JIT может в некоторых случаях создаватьболее агрессивные предположения о коде (производящие более быстрый код, чем статический компилятор), потому что у него есть возможность вернуться к менее оптимизированной версии, если эти предположения окажутся неверными.

1 голос
/ 13 декабря 2010

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

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

При рассмотрении оптимизации в C # большая часть оптимизации происходит при переводе с C # на IL, не JIT.

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