Как устранить необходимость JIT, когда целевая платформа предопределена? - PullRequest
1 голос
/ 11 февраля 2012

Замечательно, что с помощью Intermediate Language (.Net: MSIL, Java: Bytecode) мы можем достичь независимости от платформы.Но когда приложение должно работать только на одной платформе (например, Windows), в этом случае есть какой-либо простой способ указать, что «мне не нужен JIT каждый раз, когда мне просто дают собственный код».?

Ответы [ 3 ]

4 голосов
/ 11 февраля 2012

Одиночная платформа (Windows) на самом деле не означает единственную цель. В настоящее время я работаю на Windows - и некоторые двоичные файлы x86, а некоторые x64. Даже в пределах одного и того же семейства процессоров разные специальные микросхемы имеют разные возможности, о которых может позаботиться JIT.

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

Следует отметить, что, хотя Hotspot JIT для Java является адаптивным, как упоминает Dolda2000, .NET JIT в настоящее время «только один раз» - он не будет повторно JIT-код, тратя больше усилий если он оказывается очень интенсивным или делает предположения относительно подклассов, а затем "отменяет" их позже.

4 голосов
/ 11 февраля 2012

Я не могу говорить за .Net, но, безусловно, есть нативные компиляторы Java, такие как GNU GCJ.

Более важно, однако, действительно ли вы уверены, что хотите , чтобы избежать JITing?JIT-компилятор, работающий на основе знания глобального состояния кода, часто может делать оптимизации, которые статические компиляторы не могут.Например, JIT-компилятор может встроить виртуальные методы, когда он знает, что подкласса в настоящее время не существует, который переопределяет его (в то время как статический компилятор не мог знать, будет ли такой класс (статически или динамически) связан позднее)на).Есть также много других примеров, но я не думаю, что цель этого ответа - перечислить их.:)

1 голос
/ 11 февраля 2012

Еще один момент:

Многие современные фреймворки манипулируют байт-кодом во время загрузки классов.Это означает, что код на диске не является исполняемым кодом.Любой Java Framework, делающий внедрение зависимостей на основе аннотаций, будет использовать это.JPA / Hibernate использовать это.AOP (Аспектно-ориентированное программирование) обычно использует это, хотя платформы AOP обычно также предоставляют способ манипулировать файлами классов во время сборки.

Компиляция кода в исходный код приведет к ихрамки бесполезны.

...