Трудно сказать, как конкретная JVM реализует экземпляр, но в большинстве случаев Объекты сравнимы со структурами, а также с классами, и каждая структура объекта имеет указатель на структуру класса, экземпляром которой он является. Так на самом деле instanceof для
if (o instanceof java.lang.String)
может быть так же быстро, как следующий код C
if (objectStruct->iAmInstanceOf == &java_lang_String_class)
при условии, что JIT-компилятор установлен и выполняет достойную работу.
Учитывая, что это только доступ к указателю, получение указателя с определенным смещением, на которое указывает указатель, и сравнение его с другим указателем (что в основном совпадает с проверкой на равенство 32-битных чисел), я бы сказал, операция на самом деле может быть очень быстрой.
Это не обязательно, однако, это сильно зависит от JVM. Однако, если это окажется узким местом в вашем коде, я бы посчитал реализацию JVM довольно плохой. Даже тот, у которого нет JIT-компилятора и только интерпретирует код, должен иметь возможность выполнить экземпляр теста практически мгновенно.