Skip to content

Latest commit

 

History

History
56 lines (34 loc) · 4.27 KB

5.6.1 MethodDispatch.md

File metadata and controls

56 lines (34 loc) · 4.27 KB

Диспетчеризация

  1. iOS-Инкубатор. Диспетчеризация в iOS
  2. Диспетчеризация методов в Swift
  3. Диспетчеризация методов iOS

Диспетчеризацией методов называют процесс поиска адреса инструкций, которые нужно выполнить CPU при вызове определенного метода (какую имплементацию система вызовет у метода).

Другими словами, цель диспетчеризации методов состоит в том, чтобы программа сообщала процессору, где он может найти исполняемый код конкретного метода в памяти.

Диспетчеризация происходит каждый раз, когда вызывается метод:

alt text

Виды диспетчеризации

Основные виды диспетчеризации:

  • Java: табличная (по дефолту) / статическая через final
  • C++: статическая (по дефолту) / табличная через virtual
  • Objective-C: на сообщениях
    • Из-за поддержки ЯП C можно исп-ть и static
  • Swift: есть все виды

alt text

Оптимизация диспетчеризации вызовов

Данная статья Apple более подробно рассказывает про способы повышения производительности, уменьшая использование табличной диспетчеризации.

Для повышения производительности, задача компилятора и разработчика заключается в том, чтобы, как можно больше методов использовали статическую диспетчеризацию, в этом нам поможет следующие ключевые слова:

I. final не позволяет наследоваться классам (override), а методам переопределяться, что приводит к статической диспетчеризации

Пример:
```swift
final class MyClass() {
    func someMethod() {
        print("Direct Dispatch")
    }
}
```

II. private ограничивает видимость метода или всего класса. Отсутствие каких-либо переопределений позволяет компилятору автоматически добавлять ключевое слово final

III. Whole Module Optimization позволяет компилятору просматривать все исходные файлы в едином модуле (все файлы в модуле компилируются в одном процессе), проверяются и оптимизируются вместе на уровне SIL в Swift. Это позволяет компилятору использовать final для всех методов без переопределений.

Общие правила диспетчеризации на рисунке:

alt text


5.6 Method Dispatch Theme Folder | Back To iOSWiki Contents | 5.6.2 Static(direct) Dispatch Theme