Історія traceview.

Відео: Google I / O 2011: Accelerated Android Rendering

Нещодавно я зробив серйозний погляд на Traceview, і мені спало на голову, по-перше, що є, ймовірно, кілька інших разработчіковAndroid, які не використали його, і по-друге, це можливість чітатьлекціі на одній з моїх улюблених тем: підвищення продуктивності іпрофілірованія.Ето, мабуть, трохи Android-101- якщо ви вже знаетевсе про Traceview, ви можете зупинитися тут і повернутися до кодування.Створення служби швидкого запуску.Для будь-якої програми, яка навіть середньої складності, ви не достаточноумни, щоб передбачити, які частини будуть повільно працювати, тому чтонікто мало розумний, щоб передбачити, де програмне обеспеченіеімеет вузькі місця.Написати швидко додаток і побудувати його простим способом,якімогли б працювати, уникаючи дурних речей, як алгоритми порядку -N-квадратів і робити введення / виведення в потоці призначеного для користувача інтерфейсаAndroid. Хто знає, може бути досить швидко, а потім на жаль! Якщо це не досить швидко, здогадатися відразу чому сложно.Но дізнатися це можна використовуючи Profiler.На насправді я зробив це, коли був загнаний в кут, використовуючи такі речі, як System. err.println.К щастя, Android поставляється з досить пристойним Profiler, так чтови не повинні отримати потворні додатки.Case Study: рятувальник 2У мене ця маленька утиліта в Android Market називається вона рятівник 2.З одного боку, вона читає SMS і телефонних дзвінків виходять з сістемиі зберігаються в текстовий файл JSON на карту SD.Етот процес йде довольномедленно, це показує хороший динамічний індікатор.Я задався питанням, чому цей процес йде так повільно, щоб записати кілька сотень запісейв текстовий файл на пристрій, який, врешті-решт, має гігагерцовийпроцессор.Той, хто припускає, що уповільнення йде через машин ContentProviderчтенія системних журналів, або якщо це неможливо, витрати на запісьв карту SD. Давайте все таки дізнаємося, через що цей процес йде такмедленно.Включеніе трасування Saver.java поставте дужки в коді в свій код- метод виглядає ось так:
 public void run () {android.os.Debug.startMethodTracing ( "lsd") - // ... method body elidedandroid.os.Debug.stopMethodTracing () -}
Перший виклик зробить трасування, аргумент "lsd" (Stands for Life Saver Debug, of course) скаже системі куди покласти код - / SDCard / lsd.trace. Пам`ятайте, що роблячи це, ви повинні додати WRITE_EXTERNAL_STORAGE дозволу, чтобиви можли зберегти інформацію -не забудьте потім видалити, перш ніж закончіте.Інженер Android Xavier Ducrohet пише, щоб нагадати: "DDMS має кнопкузапуска і зупинки профілювання" Device View.После натискання на кнопкуостановіть , запускається файл трасування TraceView.Ето НЕ малозначно, какположіть початок / stopMethodTracing в коді, але може бути вельми полезним.Для віртуальних машин раніше, ніж Froyo, потрібен дозвіл, а також (в основному DDMS автоматизувати отримання сліду від SD-карти і сохранітьег локально перед викликом traceview) .Для Froyo ВМ-ВМ може відправити файлтрассіровкі за допомогою бездротової технології JDWP і дозволу не потрібні (що действітельнополезно). "Коли ви запустите додаток, то ви скопіюєте на ваш комп`ютер і запустітеTraceview.540> adb pull /sdcard/lsd.trace541> traceview lsd


На даний момент, ви повинні були помітити три речі. По-перше, перетворення відстеження насправді уповільнює роботу програми. По-друге, tracefile великий, в цьому випадку потрібні 8.6m для запуску, які мали, як чотири секунди. По-третє, що traceview виглядає досить прохолодно.

Бар у верхній панелі показує додаток і теми і як вони Розділи по часу, так як Nexus однопотоковий процесор, і вони виконуються по черзі. Зробіть нуль на одному 100-мс сегменті.

У верхньому рядку, де виконується код додатка (червоний сегмент GC), в середній лінії в потоці призначеного для користувача інтерфейсу і сплески активності ProgressBar поновлення, не знаю, що за третій потік, названий HeapWorker, але це не є однією з основних причин виконання програми, давайте його ігнорувати.
У нижній частині екрана, де дійсно цікаві дані, він показує, який з ваших методів витратив час, і може бути відсортований купою різних способів. Давайте зосередимося на перших двох лініях.

Переклад на англійську мову, це говорить про те, що на вищому рівні рутинних робіт споживається 100% від часу, якщо ви дозволите все, але тільки 0,9% саме час. Наступний рядок раптом починає отримувати реальне цікаво: java.io.PrintStream.println (Object) і все, що він викликає використовують 65,2% часу програми. Це код, який пише JSON на карту SD. Зараз, ми знаємо, що на перший погляд завдання витягати дані з ContentProviders телефону, здається, не дуже дорогий.
Чи можемо ми зробити висновок, що додаток обмежується поганим написанням продуктивність карти SD? Давайте деталізуємо, що і як робиться в найбільш очевидних точках.

Є неприємний сюрприз. Звичайно, println дзвінки (по суті) ToString для всіх своїх аргументів. Схоже, що перетворення аргументів на рядки займає більше половини часу, перш ніж він напише println (об`єкти) на println (String).
Розглянемо покроково деталізацію в println (String), це дозволить припустити, що є деякі повільні I / O і відбуваються вони на мапі SD. Але давайте подивимося, що всередині String.valueOf виклику.

Відео: Android for Java Developers (Big Android BBQ 2015)

Виявляється, що org.json.JSONObject.toString є тим, що професійні програмісти називають сімейними операціями, тому ми туди не пойдём.Ви можете копатися в ньому, але це просто пригнічує.
Що ж можна зробити - впорядкувати всі процедури по їх «Ексклюзив», як і число процесорів. Тут все з них, які використовують 1% або більше від загального часу виконання.

Там в трохи GC і Android рамках перегляд суперечки речі там, але дисплей домінують org.jason і java.lang.StringBuilder коду.
висновок
Реальний висновок, що в разі цього додатка можна дійсно не піклуються про продуктивність. Користувач запускає його із загальної суми два рази, один раз на старий телефон і один раз на новий телефон, так що я не думаю, що в цьому є проблеми.
Щоб прискорити цей процес потрібно зробити - по-перше, або відмовитися від використання JSON, або знайти більш дешевий спосіб сериализации. По-друге, зробити менше println викликів, зберігати дані разом в одному великому буфері і просто прискорити його з першого введення / виведення виклику. Traceview це хороший інструмент, і якщо ви ще не знаєте його, ви зобов`язані зробити це заради себе, щоб навчитися цьому.

Поділися в соц мережах:
Cхоже

Увага, тільки СЬОГОДНІ!