сложность instanceof оператора Java - PullRequest
6 голосов
/ 26 октября 2011

Мне было интересно, насколько вычислительно дорогим является использование оператора instanceof в java, и я хотел узнать, есть ли какие-нибудь лучшие альтернативы

Ответы [ 4 ]

9 голосов
/ 26 октября 2011

Альтернатива - избегать использования instanceof и правильно проектировать ваши классы (в смысле ОО).

Поскольку оператор instanceof имеет соответствующую инструкцию байтового кода " instanceof ", вероятно, не будет более производительного подхода;но это также может зависеть от того, как оптимизируется фактическая JVM.

7 голосов
/ 26 октября 2011

instanceof чертовски быстро. Однако это, как правило, симптом плохо продуманного дизайна.

Он будет иметь примерно ту же производительность, что и (успешный) актерский состав, поскольку он делает почти то же самое. Действительно, задача примерно эквивалентна "виртуальному" вызову метода.

На вменяемых реализациях: Для классов это просто вопрос получения класса времени выполнения и просмотра фиксированного смещения для проверки суперкласса (если у вас нет цепочки наследования более восьми классов для HotSpot). Интерфейсы немного сложнее, но обычно кешируются последние два варианта использования для любого конкретного класса времени выполнения. Так что это тоже быстро.

2 голосов
/ 26 октября 2011

Я предполагаю, что вы на самом деле профилировали свой код и обнаружили, что использование instanceof является нетривиальным ударом по производительности? Если нет, то вы почти наверняка решаете проблему, решение которой не стоит вашего времени.

Если все, что вы делаете, это код, подобный этому:

if ( something instanceof MyClass ) {
    MyClass mySomething = (MyClass) something;
    //...
} else {
    //exceptional case
}

Тогда, возможно, сначала можно будет сыграть приведение и позволить ClassCastException быть вашим "исключительным случаем":

try {
   MyClass mySomething = (MyClass) something;
} catch (ClassCastException cce) {
    //exceptional case
}

Теперь, хотя это может быть преждевременным оптимизация , было бы преждевременно переосмысливать ваш дизайн. Чрезмерное употребление instanceof - это дизайнерский запах. В общем, вы должны использовать дженерики и полиморфизм таким образом, чтобы уменьшить количество раз, которое вы использовали бы instanceof (и действительно приведение) к (почти) нулю.

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

  2. Если вы обнаружите, что «знаете», что объект определенного типа, но вы сделали какой-то шаг, который заставит компилятор отследить этот факт (например, вы поместили его в необработанный List), это может быть кандидат на обобщения.

2 голосов
/ 26 октября 2011

Если вы хотите проверить, является ли объект экземпляром определенного класса (но не если это extends или implements это), возможно, сравнение классов с == будет быстрее:

o.getClass() == YourClass.class

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

...