2013-11-11 2 views
9

Это общая практика кодирования использовать ссылки интерфейса/базовый класс при объявлении объекта типа:Java производительность

InterfaceIF ref = new SomeObject(); 

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

Это прекрасно объяснил here also.

Но одна вещь, которую я стараюсь не в состоянии понять, и нет ответа на вопрос:

  • ли производительность получает осуществляется с помощью интерфейса/базового класса Справка.
  • Если да, то это влияет на положительные или отрицательные.
+0

Почти 99,999% уверены, что производительность при использовании интерфейсов не влияет. Я не знаю, как это сделать. Почему вы думаете, что это повлияет на производительность? – mwhs

+0

@mwhs: На самом деле. Это может быть очень много, поскольку виртуальный вызов довольно дорогостоящий, но JVM устраняет (почти?) Все эти накладные расходы. – maaartinus

+0

Но если JVM устраняет накладные расходы, тогда затраты будут одинаковыми в конце концов, не так ли? – mwhs

ответ

8

Использование класса напрямую может быть быстрее, но не медленнее. Если JVM видит конкретный класс, то он знает, «кому позвонить». Не обязательно, так как могут быть подклассы, если только класс не является окончательным. В JVM могут быть даже подклассы, которые еще не были просмотрены позже.

  • Для окончательного класса вызов метода может быть оптимизирован для инструкции native CALL. Это тривиальный случай.

  • Если класс не является окончательным, но подкласса еще не загружен, то он совпадает с одной дополнительной проверкой где-то в начале. Когда проверка не удалась, JVM должен выбросить этот излишне оптимистически скомпилированный метод и перекомпилировать (неважно).

  • Когда есть подклассы, все зависит от того, сколько из них действительно встречается на данном сайте вызова. Если только один, то достаточно проверить, достаточно проверить, что данный класс является ожидаемым (перемещая этот тест из циклов и т. Д., Эти накладные расходы становятся незначительными).

  • Случаи с большим количеством кандидатов, очевидно, медленнее (Google для биморфизма и мегаморфизма).

Очевидно, что нет ничего, что могло бы сделать звонок через интерфейс быстрее.

Если существует несколько реализаций, и более одного вызовов вызывается с сайта вызова, тогда есть накладные расходы на отправку виртуального вызова. Для получения дополнительной информации см. this answer и об этом benchmark.

+6

* Использование класса напрямую может быть быстрее, никогда не медленнее. * Можете ли вы объяснить этот тезис? – mwhs

+0

@mwhs: Достаточно объяснено? Это как позвонить кому-то из вашей телефонной книги, а не позвонить в информационную службу. – maaartinus

+0

@maaartinus Ну. Но будет здорово, если вы разместите ссылку на доказательство. =) –

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