Ответ
Direct Dispatch (статическая диспетчеризация) — самый быстрый, потому что вызов метода разрешается на этапе компиляции. Адрес функции жестко прописывается в коде, что исключает любые накладные расходы на поиск во время выполнения (runtime), которые есть у Virtual или Witness Table dispatch.
Когда используется:
- Для
structиenum(кроме протоколов). - Для
finalметодов и классов. - Для
staticметодов. - Для
privateметодов, если компилятор может доказать отсутствие переопределений.
Пример:
struct Point {
var x, y: Int
// Direct Dispatch: структуры не поддерживают наследование
func distance(to other: Point) -> Double {
let deltaX = Double(x - other.x)
let deltaY = Double(y - other.y)
return sqrt(deltaX * deltaX + deltaY * deltaY)
}
}
let p1 = Point(x: 0, y: 0)
let p2 = Point(x: 3, y: 4)
let d = p1.distance(to: p2) // Вызов напрямую по известному адресу
Преимущества:
- Скорость: Нет поиска в таблице, меньше инструкций CPU.
- Инлайнинг: Компилятор может встроить (inline) тело функции, что еще больше ускоряет выполнение.
- Предсказуемость: Полезно для performance-critical кода.