2013-06-03 2 views
2

Есть ли способ достичь производительности JIT при удалении служебных данных JIT? Предпочтительно, компилируя файл класса в исходное изображение.Есть ли способ достичь производительности JIT без накладных расходов JIT?

Я исследовал GCJ, но даже для простой программы производительность выхода GCJ намного хуже, чем Java JIT.

+6

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

+1

Написал ли в С вариант? :) Это наверняка убьет накладные расходы JIT ... И если вы должны выполнить его с Java, есть простые способы вызвать родные библиотеки ... –

+0

Большое спасибо Assylias и Slanec. После прочтения некоторых релевантных тем, JNI (или вызов собственной программы) представляется лучшим вариантом. –

ответ

2

В прошлом было несколько «статических» компиляторов для Java, но я не знаю, что в настоящее время доступны какие-либо. Насколько я знаю, последним в использовании был «Java Transformer» для IBM iSeries «Классический JVM», но JVM была устарела в пользу JV JVM.

«Java Transformer» выполнен неплохо, но, как отмечали другие, он не смог воспользоваться всей информацией, доступной JITC во время выполнения (хотя ей удавалось воспользоваться некоторыми из среды выполнения Информация).

(Следует отметить, что «накладные расходы JITC» действительно минимальны. В большинстве случаев компиляция происходит довольно быстро и эффективно. Проблема заключается в том, что компиляция даже не запускается до тех пор, пока интерпретатор не запустится достаточно долго, чтобы собирать статистику и запускайте JITC.)

+1

[Excelsior JET] (http://www.excelsiorjet.com) жив и пинает. Отказ от ответственности: я работаю в Excelsior. –

0

Я только что нашел мой ответ здесь:

Why is Java faster when using a JIT vs. compiling to machine code?

Цитата из топа ответа:

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

+1

Эта цитата основана на ложном утверждении, что 'Class.forName()' является «убийцей AOT». См. Мой комментарий к этому ответу. –

2

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

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

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

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

Измерение степени вашей проблемы или эффективности - лучшее руководство по вопросам, а что нет. Если вы не измеряете, вы просто догадываетесь.(Даже если у вас есть 10 + опыт работы с настройками Java-систем)

0

Я бы посоветовал вам найти основную причину низкой производительности вашего Java-кода, прежде чем попробовать компиляцию AOT или переписать любые части на C++.

Перейдите на страницу http://www.javaperformancetuning.com/ за тонны информации и ссылок.

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