Производительность Xamarin.Mac

Обзор

Приложения Xamarin.Mac аналогичны приложениям Xamarin.iOS, поэтому к ним применяется множество одних и тех же рекомендаций по повышению производительности:

Однако есть несколько полезных советов, специально предназначенных для macOS.

Предпочтительное использование современной требуемой версии .NET Framework

Существует несколько целевых платформ для приложений Xamarin.Mac с различными функциями и характеристиками производительности.

По возможности следует использовать современную (Modern) платформу и работать с зависимыми библиотеками для получения дополнительной поддержки. Только современная платформа располагает возможностями компоновки, позволяющими значительно сокращать размеры сборки. Это особенно важно при включении AOT, так как компиляция AOT полных сборок может приводить к созданию больших окончательных пакетов.

Включение компоновщика

Время запуска при загрузке и в режиме "Just In Time" (JIT) линейно масштабируется по отношению к размеру окончательных двоичных файлов. Самым простым способом улучшения этого показателя является удаление неиспользуемого кода с помощью компоновщика.

Хотя это предложение в первую очередь предназначено для пользователей современной целевой платформы, компоновка платформы также может обеспечить ограниченное повышение производительности.

Включение AOT при необходимости

Другим аспектом производительности при запуске является JIT-компиляция сборок в машинный код. Компиляция АОТ (Ahead of Time) может значительно сократить время запуска, однако она связана с поиском компромиссов, которые рассматриваются в документации по AOT.

Наличие высокопроизводительных делегатов

Основу многих приложений Xamarin.Mac составляют представления Cocoa, такие как NSCollectionView, NSOutlineView или NSTableView. Часто эти представления формируются на базе предоставляемых в Cocoa классов Delegate и DataSource, назначение которых следует из их имен.

Многие из этих точек входа вызываются довольно часто — иногда несколько раз в секунду во время прокрутки.

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

Использование API-интерфейсов Cocoa для повторного использования представлений

Многие представления Cocoa, содержащие множество дочерних представлений или ячеек (например, NSCollectionView, NSOutlineView и NSTableView) предоставляют API-интерфейсы для создания и повторного использования представлений. Они формируют пулы общих элементов и препятствуют возникновению проблем производительности при быстрой прокрутке представлений.

Использование async и предупреждение блокировки пользовательского интерфейса

Классические приложения часто обрабатывают большие объемы данных, поэтому поток пользовательского интерфейса, ожидающий синхронную операцию, может быть с легкостью заблокирован.

Чтобы избежать блокировки пользовательского интерфейса, по возможности следует использовать ключевое слово async и потоки.

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