Влияние на производительность использования instanceof в Java - PullRequest
287 голосов
/ 19 сентября 2008

Я работаю над приложением, и один из подходов к проектированию предполагает чрезвычайно интенсивное использование оператора instanceof. Хотя я знаю, что дизайн ОО обычно старается избегать использования instanceof, это другая история, и этот вопрос связан исключительно с производительностью. Мне было интересно, есть ли какое-либо влияние на производительность? Это так же быстро, как ==?

Например, у меня есть базовый класс с 10 подклассами. В единственной функции, которая принимает базовый класс, я проверяю, является ли класс экземпляром подкласса, и выполняю некоторую процедуру.

Один из других способов решения этой проблемы - использовать вместо этого целочисленный примитив «id типа» и использовать битовую маску для представления категорий подклассов, а затем просто выполнить сравнение битовой маски для подкласса «id типа "постоянной маске, представляющей категорию.

instanceof каким-то образом оптимизируется JVM, чтобы быть быстрее, чем это? Я хочу придерживаться Java, но производительность приложения имеет решающее значение. Было бы здорово, если бы кто-то, кто был на этом пути раньше, мог бы дать совет. Не слишком ли я придираюсь к чему-то или сосредотачиваюсь не на том, что нужно оптимизировать?

Ответы [ 23 ]

0 голосов
/ 19 сентября 2008

Вы сосредотачиваетесь на неправильной вещи. Разница между instanceof и любым другим методом проверки того же самого, вероятно, даже не поддается измерению. Если производительность критична, то Java, вероятно, не тот язык. Основная причина в том, что вы не можете контролировать, когда виртуальная машина решает, что она хочет собирать мусор, что может привести к увеличению загрузки ЦП до 100% в течение нескольких секунд в большой программе (MagicDraw 10 отлично подходит для этого). Если вы не контролируете каждый компьютер, на котором будет работать эта программа, вы не сможете гарантировать, на какой версии JVM она будет работать, и у многих из старых были серьезные проблемы со скоростью. Если это небольшое приложение, вы можете быть в порядке с Java, но если вы постоянно читаете и отбрасываете данные, то вы заметите, когда GC начнет работу.

0 голосов
/ 19 февраля 2009

Что касается замечания Питера Лори, что вам не нужен instanceof для выпускных классов и вы можете просто использовать ссылочное равенство, будьте осторожны! Хотя конечные классы не могут быть расширены, они не гарантированно загружаются одним и тем же загрузчиком классов. Используйте x.getClass () == SomeFinal.class или тому подобное, только если вы абсолютно уверены, что для этой части кода в игре только один загрузчик классов.

0 голосов
/ 19 сентября 2008

Вы должны измерить / профиль, если это действительно проблема производительности в вашем проекте. Если это так, я бы порекомендовал редизайн - если это возможно. Я почти уверен, что вы не можете превзойти нативную реализацию платформы (написано на C). В этом случае также следует учитывать множественное наследование.

Вы должны рассказать больше о проблеме, возможно, вы могли бы использовать ассоциативный магазин, например Карта , если вас интересуют только конкретные типы.

...