Делает ли пометка финала класса Swift также, что все содержащиеся в нем переменные, let и функции автоматически получают преимущества Static Dispatch? - PullRequest
2 голосов
/ 23 марта 2019

Я пытаюсь выжать из своего приложения все последние возможности.Я стараюсь использовать Structs над классами везде, где это возможно (без разделения состояний, прямой отправки по умолчанию и т. Д. И т. Д.).Но мои контроллеры представления и объекты UIView, очевидно, все еще являются классами.Я хочу заставить прямую рассылку для каждого из моих методов и элементов данных - из соображений производительности.

Нужно ли по-прежнему отмечать каждые var , let и func в моем классе final , или это так?Достаточно просто пометить класс хостинга как финальный, чтобы все, что под ним использовалось, прямой метод отправки ?

Другими словами: очень утомительно вставлять final везде - перед каждым методом и переменной.Поэтому я надеюсь, что простое размещение этого класса само по себе будет иметь тот же эффект, что и прямая рассылка всем членам класса.Но я не знаю, как это проверить или проверить.

Для тех, кому интересно, о чем я говорю, ознакомьтесь с этой статьей: «Отправка метода в Swift».Структуры и расширения протокола предоставляют статический метод отправки по умолчанию (самая быстрая производительность), а классы - нет.Статические методы в классах делают, но я хочу принудительно использовать Static Dispatch для всех методов экземпляров и элементов данных.
https://www.raizlabs.com/dev/2016/12/swift-method-dispatch/

В документации среды исполнения swift упоминается влияние на способность к подклассу, но не описываетсячто происходит с диспетчерским поведением дочерних элементов и функций классов, помеченных как «окончательные».Было бы неплохо, если бы все, что находится под ним, получило Static Method Dispatch без необходимости отмечать все окончательно по отдельности.

final

Примените этот модификатор к классу или к свойству, методу или члену индекса в классе.Он применяется к классу, чтобы указать, что класс не может быть разделен на подклассы.Он применяется к свойству, методу или индексу класса, чтобы указать, что член класса не может быть переопределен ни в одном подклассе.Пример использования финального атрибута см. В разделе «Предотвращение переопределений».

1 Ответ

3 голосов
/ 23 марта 2019

Да, просто пометьте тип как final, а его свойства и методы тоже final.Но если это код UIKit (переопределение методов, методы делегирования UIKit и т. Д.), Он всегда будет отправляться динамически.Это действительно только материал для вашего собственного кода, требующего больших вычислительных ресурсов, и даже тогда возникает вопрос, является ли это критической проблемой или есть ли другие проблемы (например, поиск в массивах, а не в словарях, распараллеливание сложных подпрограмм, использование Accelerate или Metalнекоторых задач, включая сборку оптимизированных выпусков и т. д.).

Но если вы переходите к статической диспетчеризации для кода, который вызывается не очень часто, разница может быть скромной / ненаблюдаемой.

Мы должны забыть о малой эффективности, скажем, в 97% случаев: преждевременная оптимизация - корень всего зла.Однако мы не должны упускать наши возможности в эти критические 3%.

Мне любопытно, действительно ли вы провели достаточно анализа, чтобы подтвердить, что вы в этих 3%.Если да, прошу прощения за указание на очевидное;просто я ничего не видел выше, чтобы указать, как вы определили, что статическая диспетчеризация будет иметь реальное значение.Если у вас есть проблема с производительностью, то, как правило, все решается на final, и вряд ли это будет серебряная пуля для решения этой проблемы.


Я бы направил вас к видеороликам WWDC, в которых изложены методологии определенияи решить практические проблемы с производительностью:

...