Для розумної реалізації Java:
Кожен об'єкт має заголовок, що містить, серед іншого, вказівник на тип виконання (наприклад, Double
або String
, але він ніколи не може бути CharSequence
або AbstractList
). Якщо припустити, що компілятор виконання (як правило, HotSpot у випадку Sun) не може визначити тип статично, то деякі перевірки потрібно виконати створеним машинним кодом.
По-перше, цей вказівник на тип виконання повинен бути прочитаний. Це необхідно для виклику віртуального методу в подібній ситуації в будь-якому випадку.
Для кастингу до типу класу точно відомо, скільки суперкласів існує, поки ви не потрапите java.lang.Object
, тому тип можна читати з постійним зміщенням від покажчика типу (фактично першої вісімки в HotSpot). Знову це аналогічно зчитуванням покажчика методу для віртуального методу.
Тоді значення зчитування просто потребує порівняння з очікуваним статичним типом амплуа. Залежно від архітектури набору інструкцій, інша інструкція потребує розгалуження (або помилки) на неправильній гілці. Такі ISA, як 32-розрядна зброя, мають умовні вказівки і можуть мати можливість пройти сумний шлях щасливим шляхом.
Інтерфейси складніші через багаторазового успадкування інтерфейсу. Як правило, останні два виклики інтерфейсів кешуються у режимі виконання. В перші дні (більше десятиліття тому) інтерфейси були трохи повільними, але це вже не актуально.
Сподіваємось, ви можете побачити, що подібні речі значною мірою не мають значення для продуктивності. Ваш вихідний код важливіший. З точки зору продуктивності, найбільшим ударом у вашому сценарії можуть бути пропуски кеш-пам'яті від переслідування вказівників об’єктів у всьому місці (інформація про тип, звичайно, буде загальною).