Почему Direct Dispatch в Swift самый быстрый метод диспетчеризации?

«Почему Direct Dispatch в Swift самый быстрый метод диспетчеризации?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 кода.