1. Запустить оптимизацию
1. Холодный старт (начать с нуля)
Три этапа холодного запуска
1.1 Перед выполнением основной функции
- Загрузить исполняемый файл (файл mach-o)
- Загрузите библиотеку динамической компоновки, выполните настройку указателя перебазирования и привязку символа.
- Обработка инициализации среды выполнения Objc, включая регистрацию классов, связанных с Objc, регистрацию категорий и проверку уникальности селектора.
- Инициализация, включая выполнение метода +load(), вызовы функций, измененные атрибутом((конструктором)), и создание статических глобальных переменных C++.
Оптимизация
- Уменьшите динамическую загрузку библиотеки . Каждая библиотека сама по себе имеет зависимости. Apple рекомендует использовать меньше динамических библиотек и пытаться объединить несколько динамических библиотек при использовании большого количества динамических библиотек. Что касается количества, Apple рекомендует использовать до 6 несистемных динамических библиотек.
- Уменьшите загрузку классов или методов, которые не будут использоваться после запуска.
- Содержимое метода +load() может быть выполнено после завершения рендеринга первого экрана или заменено методом +initialize() . Потому что в методе +load() операция замены метода во время выполнения приведет к потреблению 4 миллисекунд. Не стоит недооценивать эти 4 миллисекунды. Немногое складывается. Выполнение метода +load() будет оказывать все большее влияние на скорость запуска.
- Контролируйте количество глобальных переменных C++
1.2 После выполнения основной функции
В основном относится к началу выполнения функции main() и выполнению методов, связанных с рендерингом первого экрана, в методе DidFinishLaunchingWithOptions Appdelegate .
- Операции чтения и записи файлов конфигурации, необходимые для инициализации первого экрана.
- Чтение больших данных из списка первого экрана
- Множество вычислений для рендеринга выше сгиба.
Оптимизация
Функционально разобраться, какие функции инициализации необходимы для отрисовки первого экрана, какие необходимы для запуска приложения, а какие необходимо инициализировать только тогда, когда соответствующая функция начнет использоваться. Разобравшись, разложите эти функции инициализации по соответствующим этапам.
1.3 Рендеринг первого экрана завершен
Начинается, когда рендеринг завершен, и заканчивается, когда заканчивается область действия метода DidFinishLaunchingWithOptions .
Оптимизация
- Оптимизация функционального уровня:
после начала выполнения функции main() и до завершения рендеринга первого экрана обрабатываются только операции, связанные с первым экраном. Инициализация других служб, не относящихся к первому экрану, мониторинг регистрации, чтение файла конфигурации и т. д. все это делается после завершения рендеринга первого экрана. - Оптимизация на уровне метода
проверяет, какие трудоемкие методы находятся в основном потоке, до завершения рендеринга первого экрана, а также задерживает или асинхронно выполняет ненужные трудоемкие методы. Обычно трудоемкий метод в основном возникает при расчете большого объема данных.Специфической производительностью является загрузка, редактирование и хранение ресурсов, таких как изображения и файлы.
2. Горячий старт
- Приложение находится в памяти и работает в фоновом режиме. Нажмите значок еще раз, чтобы войти в приложение.
3. Методы мониторинга запуска приложения.
- Регулярно записывайте стек вызовов методов в основном потоке и рассчитывайте затраты времени каждого метода за определенный период времени.
- Подключите метод objc_msgSend , чтобы понять время выполнения всех методов .
2. Проблема Катона
2.1 Сумма ЦП ГП
CUP (Центральный процессор, центральный процессор)
Создание и уничтожение объектов, настройка атрибутов объекта, расчет макета, расчет и верстка текста, преобразование и декодирование формата изображения, рисование изображений (Core Graphics)
Решение для оптимизации CUP
- Попробуйте использовать облегченные объекты. Например, там, где обработка событий не требуется, вы можете рассмотреть возможность использования CALayer вместо UIView.
- Не изменяйте часто связанные свойства UIView, такие как рамка, границы, преобразование и т. д.
- Постарайтесь заранее просчитать макет , рассчитать рамку, границы и т. д. и изменить это один раз , а не несколько раз ;
- Использование Autolayout потребует больше ресурсов, чем непосредственная установка фрейма.
- Лучше всего поддерживать размер изображения в соответствии с размером UIImageView, чтобы уменьшить ресурсы ЦП для операций масштабирования;
- Контролируйте максимальное количество одновременных потоков
- Попробуйте вынести трудоемкие операции в подпотоки (размер текста, обработка изображений).
GPU (графический процессор, графический процессор)
Рендеринг текстур
Решение для оптимизации графического процессора
- Максимально сократите количество и уровни представлений. Отрисовка многоуровневых представлений требует больше ресурсов графического процессора.
- Старайтесь избегать показа большого количества изображений за короткий период времени и старайтесь объединить несколько изображений в одно для отображения.
- Максимальный размер изображения , который может обработать графический процессор, составляет 4096x4096. Как только этот размер будет превышен, ресурсы процессора будут заняты для обработки, поэтому текстура не должна превышать этот размер, насколько это возможно.
- Уменьшите прозрачность вида (альфа<1). Если есть прозрачность, требуется расчет смешивания . Если она не прозрачна, установите для непрозрачности значение ДА.
2.2 Рендеринг за кадром (старайтесь избегать рендеринга за кадром)
В OpenGL графический процессор имеет 2 метода рендеринга.
- Рендеринг на экране: текущий рендеринг экрана, операции рендеринга выполняются в экранном буфере, используемом в данный момент для отображения.
- Внеэкранный рендеринг: внеэкранный рендеринг, открытие нового буфера за пределами текущего экранного буфера для операций рендеринга.
Причины, по которым рендеринг за кадром снижает производительность
- Необходимо создать новый буфер
- Весь процесс закадрового рендеринга требует многократного переключения контекстной среды: сначала переключение с текущего экрана (On-Screen) на закадровый (Off-Screen), после завершения закадрового рендеринга рендеринг результаты закадрового буфера отображаются на экране, необходимо переключить контекст с закадрового на текущий экран
Оптимизация
- Растеризация, сократите использование Layer.shouldRasterize = YES
- Маска, сократите использование Layer.mask
- Скругленные углы, уменьшите и установите Layer.masksToBounds = YES, Layer.cornerRadius больше 0 (вы можете нарисовать и обрезать закругленные углы с помощью CoreGraphics или попросить пользовательский интерфейс предоставить изображения с закругленными углами).
- Shadow, сократите использование Layer.shadowXXX (если установлен Layer.shadowPath, рендеринг за кадром не произойдет)
3. Оптимизация энергопотребления
- Максимально сократите энергопотребление процессора и графического процессора.
- Используйте таймеры экономно
- Оптимизация операций ввода-вывода
- Старайтесь не записывать часто небольшие данные. Лучше всего записывать сразу пакетами.
- При чтении и записи больших объемов важных данных рассмотрите возможность использования send_io, который предоставляет API для асинхронных операций ввода-вывода файлов на основе GCD. Используя диспетчер_io, система оптимизирует доступ к диску.
- Если объем данных относительно большой, рекомендуется использовать базу данных (например, SQLite, CoreData).
4. Оптимизация сети
- Уменьшайте и сжимайте сетевые данные
- Если результаты нескольких запросов одинаковы, попробуйте использовать кеширование
- Используйте возобновление точки останова, иначе один и тот же контент может передаваться несколько раз, когда сеть нестабильна.
- Не пытайтесь выполнять сетевые запросы, когда сеть недоступна.
- Разрешить пользователям отменять длительные или медленные сетевые операции и устанавливать соответствующие таймауты.
- При пакетной передаче, например, при загрузке видеопотока, не передавайте очень маленькие пакеты, загружайте весь файл напрямую или скачивайте его большими кусками. Если вы загружаете рекламу, загружайте больше сразу, а затем медленно отображайте ее. При загрузке электронных писем загружайте несколько писем одновременно, не загружайте их одно за другим.
5. Оптимизация позиционирования
- Если вам просто нужно быстро определить местоположение пользователя, лучше всего использовать метод requestLocation класса CLLocationManager. После завершения позиционирования оборудование позиционирования автоматически отключится.
- Если это не навигационное приложение, постарайтесь не обновлять местоположение в режиме реального времени и отключите службу определения местоположения после завершения определения местоположения.
- Постарайтесь максимально снизить точность позиционирования, например, не используйте kCLLocationAccuracyBest, который имеет самую высокую точность.
- Если требуется фоновое позиционирование, попробуйте установить для паузыLocationUpdatesAutomatically значение YES. Система автоматически приостановит обновление местоположения, если пользователь вряд ли двинется.
- Старайтесь не использовать startMonitoringSignificantLocationChanges, отдавайте приоритет startMonitoringForRegion:
- Когда пользователь перемещает, встряхивает или наклоняет устройство, генерируются события движения, и эти события обнаруживаются оборудованием, таким как акселерометры, гироскопы и магнитометры. В ситуациях, когда обнаружение не требуется, это оборудование следует вовремя отключить.