Как Java может быть встроена в границы виртуальных функций? - PullRequest
11 голосов
/ 12 ноября 2009

Я читаю материал о том, может ли Java быть быстрее, чем C ++, и наткнулся на следующую цитату:

Java может быть быстрее, чем C ++, потому что JIT могут быть встроены в границы виртуальных функций.

Почему Java всегда будет медленнее, чем C ++ ( обратная ссылка )

Что это значит? Означает ли это, что JIT может выполнять встроенные вызовы виртуальных функций (потому что, предположительно, он имеет доступ к информации времени выполнения), тогда как C ++ должен вызывать функцию через ее vtable?

Ответы [ 3 ]

10 голосов
/ 12 ноября 2009

Ответ на ваш вопрос: да, вот что означает цитируемый текст.

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

В отличие от этого, компилятор C ++ не знает всех возможных подтипов и, следовательно, не может определить, можно ли выполнить эту оптимизацию для (виртуального) метода. (И к тому времени, когда работает компоновщик, уже слишком поздно ...)

В других ответах говорилось, что вы можете выполнить эту оптимизацию вручную в C ++ ... но это предполагает, что вы (программист) можете выполнить анализ самостоятельно и изменить методы с виртуальных на не виртуальные. Но если вы ошиблись, у вас есть ошибка, чтобы отследить.

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

4 голосов
/ 12 ноября 2009

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

Более подробную информацию об этом можно найти в Адаптивная оптимизация в Википедии, которая включает в себя оптимизации, связанные с встраиванием.

2 голосов
/ 12 ноября 2009

Для чего стоит Java, C ++, Assembly обеспечит относительно одинаковую производительность.

Да, лучшую производительность можно достичь с помощью C ++, C или Asm, оптимизированной для рук ... однако для большинства приложений (попробуйте все, кроме серьезных графических приложений), это не является узким местом более низкая стоимость внедрения компенсирует любую предполагаемую более низкую производительность.

...