Прибыль:
- Сначала создаем профиль и измеряем реальное узкое место, оптимизируем на основе данных, а не догадок, а результаты профиля интерпретируем искусственным интеллектом.
- Возможность выбрать наиболее затратную операцию с точки зрения времени запуска, скорости работы, памяти и батареи и исключить тяжелую работу из основного потока.
- Возможность управлять расходом батареи и процессора для возможностей искусственного интеллекта, таких как модель на устройстве и облачные вызовы, посредством выборки и пакетной обработки.
Мобильные пользователи нетерпеливы. Если приложение открывается медленно, зависает при прокрутке или быстро разряжает батарею, пользователь удаляет его и ставит ему звездный рейтинг в магазине. Производительность и эффективность использования батареи — это вопрос выживания мобильного приложения; Это напрямую влияет как на удовлетворенность пользователей, так и на рейтинг магазина. ИИ — мощный помощник в обнаружении узких мест в производительности (узких местах), интерпретации результатов измерений и рекомендации по оптимизации. Но золотое правило остается: сначала измеряй, потом оптимизируй. В этом модуле мы научимся решать проблемы с производительностью и аккумулятором на основе данных с помощью искусственного интеллекта. Особенно важным вопросом является управление влиянием на батарею и производительность возможностей искусственного интеллекта, которые мы добавили в предыдущих модулях (модель на устройстве, облачные вызовы).
Оптимизация без измерения
Самая большая ошибка неопытного разработчика — это прогнозная оптимизация: тратить время на слова «это должно быть медленно». Настоящее узкое место почти всегда находится в неожиданном месте. Итак, сначала снимается профиль (профилирование — измерение, какая часть приложения сколько времени/памяти/батареи потребляет). Android Studio Profiler и Xcode Instruments предназначены для этой работы. Передача данных измерений ИИ ускоряет интерпретацию; Но без измерений сказать ИИ: «Мое приложение работает медленно, ускорьте его» — значит слепо делать прогнозы.
Четыре основные оси производительности:
ось
симптом
типичная причина
Время начала
Приложение открывается поздно
Тяжелая работа над основным потоком
Беглость (джанк)
Прокрутка застревает
Длительная обработка, ненужная перерисовка в потоке пользовательского интерфейса.
память
отек, коллапс
Утечка, большое изображение, неконтролируемый кеш
батарея/нагрев
быстрая эякуляция
Постоянное определение местоположения, сеть, датчик, фоновое задание
Совет: задавая ИИ вопрос о проблеме с производительностью, предоставьте выходные данные профиля (какая функция и сколько времени занимает, график памяти). Точные данные, такие как «Эта функция занимает 30 мс на кадр», позволяют ИИ сосредоточиться на реальном узком месте; Субъективная фраза типа «медленно» дает общий и бесполезный ответ.
Стоимость батареи способностей ИИ
Функции ИИ, которые мы добавили в этот модуль, мощные, но они не бесплатны. Извлечение модели на устройстве нагружает процессор и батарею; Постоянно работающее распознавание изображений (например, обработка каждым кадром камерой) приведет к нагреву телефона и разрядке аккумулятора за считанные минуты. С другой стороны, вызовы Cloud AI разряжают батарею, поскольку сетевое радио (антенна, которая отправляет и получает данные) постоянно включено. Решения: запускайте модель на устройстве только при необходимости, снимайте данные с камеры несколько раз в секунду, а не каждый кадр, пакетно отправляйте облачные запросы, выполняйте тяжелую работу, пока устройство заряжается или находится в режиме ожидания.
Внимание: постоянно работающая функция искусственного интеллекта (трансляция в реальном времени, непрерывное распознавание объектов) может очень быстро разрядить аккумулятор, нагреть устройство и может регулироваться системой. Функция, которая заставляет пользователя чувствовать эту стоимость, удалена. Я всегда спрашиваю AI: «Как мне сделать эту функцию экономичной для батареи?» Также задайте вопрос.
Этапы оптимизации
- Мера. Найдите реальное узкое место с помощью Profiler; не угадывай.
- Выберите самую большую проблему. Не гонитесь за улучшением на 1%; Стремитесь к самой дорогой транзакции.
- Спросите ИИ с данными. Запросите предложение по оптимизации с выводом профиля + соответствующим кодом.
- Нанесите и измерьте еще раз. Улучшение реально? Число упало?
- Регрессионный контроль. Оптимизация что-нибудь сломала? Повторите визуальное и функциональное тестирование.
три мини-кейса
Случай 1 — Поиск не в том месте. Одна команда подумала, что списки застряли, и несколько недель безуспешно переделывала код прокрутки. Когда они взяли профайлер и передали данные ИИ, оказалось, что настоящим узким местом являются перезагружаемые по сети изображения с каждой строкой. При добавлении визуального кэша плавность увеличилась с 42 FPS до 60 FPS. Урок: измерение позволяет избежать недель бесполезных усилий.
Случай 2. Особенность аккумуляторного монстра. Приложение для перевода добавило возможность перевода текста в реальном времени с помощью камеры; Пользователи жаловались, что «телефон нагрелся за 15 минут и пропало 30% заряда батареи». Когда обратились к ИИ, выяснилось, что камера обрабатывает 30 кадров в секунду; Когда это было уменьшено до 5 кадров и результат обновлен с интервалом в несколько кадров, расход заряда батареи снизился до трети, а качество было не заметно. Урок: Всегда устанавливайте ИИ с помощью глазка батареи.
Случай 3 — Медленное начало. Приложение открывалось за 4,5 секунды; 20% пользователей выходили при запуске. Профиль показал, что вся первоначальная работа (аналитика, загрузка данных, подготовка модели) выполнялась последовательно в основном потоке. С предложением ИИ они были отложены и отложены на второй план; Время открытия сократилось до 1,3 секунды, а вероятность отказа сократилась вдвое. Урок: вначале делайте только самую важную работу.
Слабая подсказка / Сильная подсказка
Слабая подсказка: «Мое приложение работает медленно, ускорьте его».
Мощная подсказка: «Прокрутка списка зависает (зависает) в моем приложении для Android. Данные профилировщика: для каждого кадра требуется 28 мс, изображения загружаются из сети каждый раз, кэш отсутствует. Связанный код: [Код адаптера RecyclerView]. Рекомендовать 3 наиболее эффективные оптимизации в порядке их воздействия. Укажите ожидаемый выигрыш и возможные побочные эффекты для каждой. Расставьте приоритеты для решений, которые не снижают качество изображения».
Копируемые шаблоны
Шаблон анализа узких мест: «Интерпретируйте следующие данные профиля и найдите 3 наиболее дорогостоящие операции: [выходные данные профилировщика]. Предложите возможную причину и конкретную оптимизацию для каждой. Сначала дайте максимальный эффект».
Шаблон оптимизации батареи: «Эта функция быстро разряжает батарею: [функция, например, постоянное местоположение]. Сделайте ее экономичной для батареи: – Уменьшите частоту выборки – Ограничение в фоновом режиме – Пакетная обработка – Запускайте только при необходимости Сортируйте решения, не нарушая работу пользователя. [код]»
Шаблон ускорения запуска: «Ускорить запуск приложения. Действия, которые сейчас выполняются при запуске: [список]. Что можно отложить, перевести в фоновый режим или загрузить с отложенной загрузкой? Выделите самое важное. [код]»
Шаблон стоимости функции искусственного интеллекта: «Оцените производительность и стоимость батареи функции [модель на устройстве / облачный вызов], которую я добавил. Перечислите показатели, которые я должен измерить, и стратегии для снижения затрат. [код]»
Распространенные ошибки
- Оптимизация без измерений. Реальное узкое место часто находится в другом месте, чем предполагалось.
- Погоня за маленькой прибылью. Стремитесь к самому дорогостоящему действию, а не к улучшению на 1%.
- Игнорирование затрат батареи на функции искусственного интеллекта. Постоянно работающая модель/камера/сеть съедают батарею.
- Утомляет основную ветку. Тяжелая работа по запуску и прокрутке не должна выполняться в потоке пользовательского интерфейса.
- Не проводить повторные измерения после оптимизации. Убедитесь, что улучшение реально и ничего не нарушает.
- Измерение производительности в эмуляторе. Реальная скорость устройства, температура и аккумулятор совершенно другие.
В заключение
Производительность и батарея — это вопрос выживания мобильного приложения. Золотое правило: сначала измерьте, потом оптимизируйте. Передача данных профиля ИИ ускоряет интерпретацию; Безмерное желание «ускориться» приводит к слепым догадкам. Стремитесь к самой дорогой сделке, не гонитесь за маленькой прибылью. Возможности искусственного интеллекта, добавленные в этот модуль, являются мощными, но требуют затрат на батарею и процессор; Управляйте этими расходами, уменьшая частоту выборки, группируя данные и запуская их только при необходимости. Повторите измерения на реальном устройстве после каждой оптимизации.
Задача приложения
Импортируйте профиль в приложение (собственный проект или пример) или создайте образец выходного профиля и интерпретируйте его ИИ с помощью «шаблона анализа узких мест». Примените оптимизацию с наибольшим эффектом и снова измерьте: действительно ли число снизилось? Кроме того, оцените функцию искусственного интеллекта, добавленную вами в этот модуль (модель на устройстве или облачный вызов), с точки зрения расхода заряда батареи с помощью «шаблона стоимости функции искусственного интеллекта» и определите хотя бы одну настройку, учитывающую энергопотребление.
контрольный список
- [ ] Профиль у меня был до оптимизации, я не угадал
- [ ] Я стремился к самой дорогой сделке, не разбрасывался малыми прибылями
- [ ] Я привел данные профиля ИИ в конкретных цифрах
- [ ] Я оценил стоимость батареи/процессора для функций искусственного интеллекта.
- [ ] Я удалил тяжелую работу из основной темы
- [ ] После оптимизации я еще раз измерил на реальном устройстве и проверил регрессию