Как да профилирате използването на паметта и производителността с Instruments?

От всички шаблони за проследяване на инструменти обичам да използвам:

  • Zombies за откриване къде даден обект се освобождава прекалено много, чудесно за отстраняване на грешки EXEC_BAD_ACCESS грешки.
  • Течове за откриване на течове на памет.
  • Основна анимация с цветово смесени слоеве за откриване на честота на кадрите и полупрозрачни подизгледи, страхотни за изглаждане на UITableView превъртане.

Винаги чувам хората да казват да профилирам използването на паметта и производителността на приложението ми.

  1. Защо трябва да профилирам използването и производителността на паметта? Приложението ми работи добре.
  2. Как го правя?

Използвах Allocations и виждам, че приложението ми за iPhone започва от 1 MB общо разпределена памет и нараства до 5 MB след нормална употреба. Какво е твърде голямо използване на паметта на iPhone? Ай Пад? Mac?


person ma11hew28    schedule 10.07.2011    source източник


Отговори (3)


За да отговорите на защо, профилирането на използването на паметта е особено важно за приложенията за iOS, тъй като iPhone и iPad имат много по-малко RAM от Mac. IPhone 4 има 512 MB RAM, но по-ранните версии имаха 256 или 128 MB. Като вземете предвид RAM паметта, която операционната система използва и многозадачността, приложението ви няма да губи много RAM, така че е важно да сте наясно колко памет използва приложението ви.

Профилирането на производителността е нещо, което обикновено правите, когато приложението ви работи бавно. Профилирайте го, за да намерите бавните места във вашия код, за да можете да накарате кода да работи по-бързо. Ако приложението ви работи добре, няма нужда да правите профил за ефективност.

За да отговорите на въпроса, използвайте инструмента за разпределение, за да измерите използването на паметта. Колоната Live Bytes в категорията All Allocations ви казва количеството памет, което вашето приложение използва в момента. Heapshot анализът на инструмента за разпределения измерва растежа на паметта във вашето приложение. Използвайте менюто от лявата страна на лентата за прескачане, за да направите heapshot анализ.

Инструментът Time Profiler профилира вашето приложение за ефективност. Трудната част от използването на инструмента Time Profiler е интерпретирането на резултатите. Инструментът Time Profiler няма да ви каже, че вашето приложение прекарва 75% от времето си във функция X. Трябва да копаете в данните, за да намерите бавните места във вашия код.

Що се отнася до приемливото използване на паметта, зависи от устройствата, които искате да поддържате, и приложението. Приложение като Xcode, използващо 100 MB RAM, би било ОК, но приложение като TextEdit, използващо 100 MB за документ от една страница, би било проблем. 5 MB не би трябвало да са проблем за приложение за iOS.

person Mark Szymczyk    schedule 11.07.2011
comment
Благодаря за толкова изчерпателния отговор! :) - person ma11hew28; 13.07.2011
comment
Открих, че инструментът за разпределение е подвеждащ, когато става въпрос за това колко памет наистина използва приложението ми. Има тенденция да дава числа, далеч под действителното използване на паметта. Инструментът Мениджър на паметта ще ви даде действителното количество памет, което вашето приложение използва в колоната Реална памет. Разработвах OpenGL игра и получавах предупреждение за недостиг на памет отляво и отдясно. Разпределенията казаха, че използвам само 12M RAM, Мениджърът на паметта каза, че използвам 100M. И така, ето го. - person Ian; 23.11.2011
comment
@Ian виж stackoverflow.com/a/8797272/287403 Изглежда, че живите байтове са по-точни, тъй като „истинските памет" в инструмента за памет продължава да показва блокове, които сте освободили отдавна и операционната система не е възстановила. Вижте също stackoverflow.com/a/7574959/287403, в който според мен общите байтове трябва да се подредят по-близо до „истинските памет' - person Bob Spryn; 12.03.2012
comment
В момента се опитваме да разберем колко големи изображения нашето приложение може да покаже наведнъж. След като написахме тестово приложение, което току-що изведе големи JPG файлове на UIScrollView, използвайки [UIImage imageNamed:] и/или [UIImage imageWithContentsOfFile:], открихме, че Allocations показва само 5MB използване точно преди приложението да се срине, докато Real Memory Usage показваше около 750MB. Така че за нашите цели в този случай Real Memory Usage ни дава повече полезна информация. - person Dave Klotz; 26.04.2012

За да разгледаме някои от коментарите в отговора на Марк:

Разпределенията на живи байтове не включват OpenGL текстурна памет, която се използва от CALayer/UIViews. Това е източникът на несъгласието с Memory Monitor.

Вижте отговора на този въпрос тук: Разбиране на потреблението на памет на iPhone

person Calvin    schedule 17.07.2012

Паметта, която наистина е заредена във физическата памет на устройството, е Resident Memory в VM Tracker Instrument.

Allocation Instrument маркира само паметта, създадена от malloc/[NSObject alloc] и някакъв буфер на рамката, например, декомпресирано растерно изображение на изображение не е включено в Allocation Instrument, но винаги заема по-голямата част от вашата памет.

Моля, гледайте WWDC 2012 Session 242 Изпълнение на приложението за iOS: Памет, за да получите информацията от Apple.

person CarmeloS    schedule 22.08.2013