Диспетчеризацией методов называют процесс поиска адреса инструкций, которые нужно выполнить CPU при вызове определенного метода (какую имплементацию система вызовет у метода).
Другими словами, цель диспетчеризации методов состоит в том, чтобы программа сообщала процессору, где он может найти исполняемый код конкретного метода в памяти.
Диспетчеризация происходит каждый раз, когда вызывается метод:
Основные виды диспетчеризации:
- Java: табличная (по дефолту) / статическая через final
- C++: статическая (по дефолту) / табличная через virtual
- Objective-C: на сообщениях
- Из-за поддержки ЯП
C
можно исп-ть и static
- Из-за поддержки ЯП
- Swift: есть все виды
Данная статья Apple более подробно рассказывает про способы повышения производительности, уменьшая использование табличной диспетчеризации.
Для повышения производительности, задача компилятора и разработчика заключается в том, чтобы, как можно больше методов использовали статическую диспетчеризацию, в этом нам поможет следующие ключевые слова:
I. final не позволяет наследоваться классам (override), а методам переопределяться, что приводит к статической диспетчеризации
Пример:
```swift
final class MyClass() {
func someMethod() {
print("Direct Dispatch")
}
}
```
II. private
ограничивает видимость метода или всего класса. Отсутствие каких-либо переопределений позволяет компилятору автоматически добавлять ключевое слово final
III. Whole Module Optimization позволяет компилятору просматривать все исходные файлы в едином модуле (все файлы в модуле компилируются в одном процессе), проверяются и оптимизируются вместе на уровне SIL в Swift. Это позволяет компилятору использовать final для всех методов без переопределений.
5.6 Method Dispatch Theme Folder | Back To iOSWiki Contents | 5.6.2 Static(direct) Dispatch Theme