Прибуток:
- Спочатку взявши профіль і вимірявши реальне вузьке місце, зробивши оптимізацію на основі даних, а не на припущеннях, і отримавши вихідні дані профілю, інтерпретовані штучним інтелектом
- Можливість націлитися на найдорожчу операцію з точки зору часу запуску, плавності, пам’яті та батареї та видалити важку роботу з основного потоку
- Можливість керувати витратами батареї та процесора можливостей штучного інтелекту, таких як модель на пристрої та хмарні виклики за допомогою вибірки та пакетної обробки
Мобільні користувачі нетерплячі. Якщо програма відкривається повільно, зависає під час прокручування або швидко розряджає батарею, користувач видаляє її та ставить зіркову оцінку в магазині. Продуктивність і ефективність батареї є питанням виживання мобільного додатка; Це безпосередньо впливає як на задоволеність користувачів, так і на рейтинг магазину. AI є потужним помічником у виявленні вузьких місць продуктивності (вузьких місць), інтерпретації результатів вимірювань і рекомендації щодо оптимізації. Але залишається золоте правило: спочатку виміряти, потім оптимізувати. У цьому розділі ми навчимося вирішувати проблеми з продуктивністю та акумулятором на основі даних за допомогою ШІ. Особливо важливою проблемою є керування впливом на батарею та продуктивність можливостей штучного інтелекту, які ми додали в попередніх модулях (модель на пристрої, хмарні виклики).
Оптимізація без вимірювання
Найбільшою помилкою недосвідченого розробника є прогнозна оптимізація: витрачати час на те, що «це, мабуть, повільно». Справжнє вузьке місце майже завжди знаходиться в несподіваному місці. Отже, спочатку береться профіль (профілювання — вимірювання того, яка частина програми споживає час/пам’ять/акумулятор). Для цієї роботи підходять Android Studio Profiler і Xcode Instruments. Передача даних вимірювань ШІ прискорює інтерпретацію; Але без вимірювання сказати штучному інтелекту «мій додаток працює повільно, прискори його» означає сліпо робити прогнози.
Чотири основні осі продуктивності:
вісь
симптом
типова причина
Час початку
Заявка відкривається із запізненням
Важка робота над основним потоком
Вільне володіння (дженк)
Сувій застряг
Тривала обробка, непотрібне перемальовування в потоці інтерфейсу користувача
пам'ять
набряк, колапс
Витік, велике зображення, неконтрольований кеш
акумулятор/обігрів
швидка еякуляція
Постійне місцезнаходження, мережа, датчик, фонове завдання
Порада: коли запитуєте штучний інтелект про проблему продуктивності, надайте вихід профілю (яка функція скільки часу займає, графік пам’яті). Жорсткі дані, такі як «Ця функція займає 30 мс на кадр», дозволяють штучному інтелекту зосередитися на справжньому вузькому місці; Суб’єктивна фраза на зразок «повільно» дає загальну та марну відповідь.
Вартість батареї здібностей ШІ
Функції ШІ, які ми додали в цей модуль, є потужними, але вони не безкоштовні. Витяг моделі на пристрої навантажує процесор і акумулятор; Безперервне розпізнавання зображень (наприклад, обробка камерою кожного кадру) нагріє телефон і розрядить акумулятор протягом декількох хвилин. З іншого боку, виклики хмарного штучного інтелекту витрачають заряд батареї, оскільки мережеве радіо (антена, яка надсилає та приймає дані) постійно увімкнено. Рішення: запускайте модель на пристрої лише за потреби, знімайте камеру кілька разів на секунду замість кожного кадру, пакетно надсилайте хмарні запити, виконуйте важку роботу, поки пристрій заряджається або неактивний.
Застереження: постійно запущена функція штучного інтелекту (трансляція в реальному часі, безперервне розпізнавання об’єктів) може дуже швидко розряджати акумулятор, нагрівати пристрій і система може придушувати її. Видаляється функція, яка змушує користувача відчувати цю вартість. Я завжди запитую штучний інтелект: "Як зробити цю функцію дружньою до акумулятора?" Також задайте питання.
Кроки оптимізації
- Виміряти. Знайдіть справжнє вузьке місце за допомогою Profiler; не гадай.
- Виберіть найбільшу проблему. Не женіться за 1% покращенням; Прагніть до найдорожчої операції.
- Запитайте ШІ з даними. Запитати пропозицію щодо оптимізації з виведенням профілю + відповідний код.
- Прикладіть і виміряйте ще раз. Чи реальне покращення? Чи впав номер?
- Регресійний контроль. Оптимізація щось зламала? Повторіть візуальне та функціональне тестування.
три міні-чохла
Випадок 1 — Пошук не в тому місці. Одна команда подумала, що списки застрягли, і безрезультатно переробляла код прокручування тижнями. Коли вони взяли профайлер і передали дані в ШІ, виявилося, що справжнім вузьким місцем були зображення, які перезавантажувалися в мережі з кожним рядком. Коли було додано візуальний кеш, плавність зросла з 42 FPS до 60 FPS. Урок: вимірювання дозволяє уникнути тижнів марних зусиль.
Випадок 2 — функція монстра батареї. Додаток для перекладу додав живий переклад тексту за допомогою камери; Користувачі скаржилися, що "телефон нагрівся за 15 хвилин і розрядився 30% акумулятора". Під час звернення до ШІ виявилося, що камера обробляє 30 кадрів на секунду; Коли його було зменшено до 5 кадрів і результат оновлено з інтервалом у кілька кадрів, споживання батареї зменшилося до однієї третини, а якість була непомітною. Урок: Завжди встановлюйте AI з око акумулятора.
Випадок 3 — повільний початок. Додаток відкривався за 4,5 секунди; 20% користувачів виходили під час запуску. Профіль показав, що вся початкова робота (аналітика, завантаження даних, підготовка моделі) виконувалася послідовно в основному потоці. З пропозицією штучного інтелекту вони були відкладені та відкладені на другий план; Час відкриття було скорочено до 1,3 секунди, а відсоток залишення вдвічі. Урок: на початку робіть лише важливу роботу.
Слабка підказка / Сильна підказка
Слабка підказка: «Мій додаток працює повільно, прискоріть його».
Потужна підказка: «Прокручування списку застрягло (несправність) у моїй програмі Android. Дані профайлера: bindImageView займає 28 мс для кожного кадру, зображення завантажуються з мережі щоразу, немає кешу. Пов’язаний код: [Код адаптера RecyclerView]. Рекомендуйте 3 найефективніші оптимізації в порядку впливу. Вкажіть очікуваний приріст і можливі побічні ефекти для кожного. Надайте пріоритет рішенням, які не знижують якість зображення».
Шаблони, які можна копіювати
Шаблон аналізу вузьких місць: «Інтерпретуйте наступні дані профілю та знайдіть 3 найдорожчі операції: [вихід профайлера]. Запропонуйте можливу причину та конкретну оптимізацію для кожної. Спершу забезпечте найбільший вплив».
Шаблон оптимізації батареї: «Ця функція швидко розряджає батарею: [функція, наприклад, постійне місцезнаходження]. Зробіть її дружньою до батареї:– Зменште частоту вибірки– Обмеження у фоновому режимі– Пакетна обробка– Запускайте лише за необхідності Сортуйте рішення, не перешкоджаючи взаємодії з користувачем. [код]”
Шаблон прискорення запуску: «Прискорити запуск програми. Що зараз виконується під час запуску: [список]. Що можна відкласти, у фоновому режимі чи відкладено завантажувати? Відокремте важливі. [код]»
Шаблон вартості функції штучного інтелекту: «Оцініть продуктивність і вартість батареї доданої мною функції [модель пристрою/хмарний виклик]. Перелічіть показники, які я маю вимірювати, і стратегії зменшення витрат. [код]»
Поширені помилки
- Оптимізація без вимірювання. Справжнє вузьке місце часто знаходиться в іншому місці, ніж передбачувано.
- Гонитва за малими прибутками. Прагніть до найдорожчої дії, а не до покращення на 1%.
- Ігнорування вартості батареї функцій ШІ. Постійно запущена модель/камера/мережа їсть батарею.
- Втомлюючи основну нитку. Запуск і прокручування не повинні бути важкими для потоку інтерфейсу користувача.
- Без повторного вимірювання після оптимізації. Переконайтеся, що покращення є реальним і нічого не порушує.
- Вимірювання продуктивності в емуляторі. Фактична швидкість пристрою, температура та акумулятор зовсім інші.
Підсумовуючи
Продуктивність і акумулятор – це питання виживання мобільного додатка. Золоте правило: спочатку виміряти, потім оптимізувати. Передача даних профілю ШІ прискорює інтерпретацію; Безмірне бажання «розігнатися» призводить до сліпих здогадів. Прагніть до найдорожчої угоди, не женіться за дрібними прибутками. Можливості штучного інтелекту, додані в цей модуль, є потужними, але потребують витрат на акумулятор і процесор; Керуйте цією вартістю, зменшивши частоту вибірки, групуючи та запускаючи лише за потреби. Вимірюйте знову на реальному пристрої після кожної оптимізації.
Аплікаційне завдання
Імпортуйте профіль у програму (ваш власний проект чи приклад) або створіть вихідний зразок профілю та надайте його інтерпретації ШІ за допомогою «шаблону аналізу вузьких місць». Застосуйте оптимізацію з найбільшим впливом і виміряйте ще раз: чи справді число впало? Також оцініть функцію штучного інтелекту, яку ви додали в цей модуль (модель на пристрої або виклик у хмарі), з точки зору заряду батареї за допомогою «шаблону вартості функції штучного інтелекту» та визначте принаймні одне налаштування, зручне для акумулятора.
контрольний список
- [ ] Отримав профіль до оптимізації, не вгадав
- [ ] Я прагнув до найдорожчої торгівлі, я не розкидався на дрібні прибутки
- [ ] Я надав дані профілю ШІ в конкретних цифрах
- [ ] Я оцінив вартість батареї/процесора функцій ШІ
- [ ] Я зняв важку роботу з основної нитки
- [ ] Після оптимізації я знову виміряв на реальному пристрої та перевірив регресію