2011-11-07 2 views
1

Я работаю над проектом iOS 5 и столкнулся с серьезной проблемой производительности, уменьшив мое приложение до < 10fps последовательно. Инструмент профилирования времени идентифицировал вызов objc::DenseMap, который, как представляется, связан с системой сохранения/выпуска/автоопределения в среде выполнения Objective-C. Этот вызов занимает значительную часть времени обработки, и мне было интересно, есть ли у кого-нибудь какие-либо указания для разрешения этого штрафа и/или способы избежать этой проблемы. Я подозреваю, что это имеет какое-то отношение к NSMutableArrays, NSMutableSets и другим изменяемым коллекциям, которые я использую для управления объектами в кадре. Любые советы или проследить за тем, чтобы отслеживать это и разрешать его, было бы очень признательно. Ниже все в след, который выглядел важным или уместную:iOS objc :: Производительность DenseMap

Running Time Self  Symbol Name 
1426.0ms 7.2% 1426.0  objc::DenseMap<objc_object*, unsigned long, true, objc::DenseMapInfo<objc_object*>, objc::DenseMapInfo<unsigned long> >::LookupBucketFor(objc_object* const&, std::pair<objc_object*, unsigned long>*&) const 
817.0ms 4.1% 0.0  objc::DenseMap<objc_object*, unsigned long, true, objc::DenseMapInfo<objc_object*>, objc::DenseMapInfo<unsigned long> >::FindAndConstruct(objc_object* const&) 
817.0ms 4.1% 0.0  _objc_rootRetain 
817.0ms 4.1% 0.0  -[NSObject retain] 
773.0ms 3.9% 0.0   objc_retain 
28.0ms 0.1% 0.0   -[NSMutableArray removeObject:] 
11.0ms 0.0% 0.0   CFRetain 
580.0ms 2.9% 0.0  objc::DenseMap<objc_object*, unsigned long, true, objc::DenseMapInfo<objc_object*>, objc::DenseMapInfo<unsigned long> >::find(objc_object* const&) 
580.0ms 2.9% 0.0  _objc_rootReleaseWasZero 
580.0ms 2.9% 0.0  _objc_rootRelease 
562.0ms 2.8% 0.0   objc_release 
1.0ms 0.0% 0.0   CFRelease 
19.0ms 0.0% 0.0  objc::DenseMap<objc_object*, unsigned long, true, objc::DenseMapInfo<objc_object*>, objc::DenseMapInfo<unsigned long> >::grow(unsigned int) 
19.0ms 0.0% 0.0  objc::DenseMap<objc_object*, unsigned long, true, objc::DenseMapInfo<objc_object*>, objc::DenseMapInfo<unsigned long> >::InsertIntoBucket(objc_object* const&, unsigned long const&, std::pair<objc_object*, unsigned long>*) 
19.0ms 0.0% 0.0  objc::DenseMap<objc_object*, unsigned long, true, objc::DenseMapInfo<objc_object*>, objc::DenseMapInfo<unsigned long> >::FindAndConstruct(objc_object* const&) 
19.0ms 0.0% 0.0   _objc_rootRetain 
19.0ms 0.0% 0.0   -[NSObject retain] 
15.0ms 0.0% 0.0   objc_retain 
4.0ms 0.0% 0.0   -[NSMutableArray removeObject:] 
5.0ms 0.0% 0.0  _objc_rootRetain 
5.0ms 0.0% 0.0  -[NSObject retain] 
4.0ms 0.0% 0.0  objc_retain 
3.0ms 0.0% 0.0   objc_retainAutoreleasedReturnValue 
1.0ms 0.0% 0.0  -[NSMutableArray removeObject:] 
3.0ms 0.0% 0.0  _objc_rootReleaseWasZero 
3.0ms 0.0% 0.0  _objc_rootRelease 
3.0ms 0.0% 0.0  objc_release 
2.0ms 0.0% 0.0  objc::DenseMap<objc_object*, unsigned long, true, objc::DenseMapInfo<objc_object*>, objc::DenseMapInfo<unsigned long> >::erase(objc_object* const&) 
2.0ms 0.0% 0.0  objc_clear_deallocating 
2.0ms 0.0% 0.0  objc_destructInstance 
2.0ms 0.0% 0.0   CFRelease 
+0

Сложно сказать, не имея никакого контекста. Сможете ли вы опубликовать весь след из инструментов? –

ответ

3

Фильтр из системных библиотек из анализа производительности и посмотреть, что указывает на то. Вы смотрите на неправильный конец стека.

Ваш код, как правило, является относительно тонким шпоном, который склеивает системные рамки любым способом, необходимым для создания вашего конкретного приложения. Подобная проблема производительности чаще всего указывает на то, что реализация ваших приложений алгоритмически неактивна; возможно, вы слишком часто перекачиваете вещи, возможно, вы собираете или заполняете коллекции, когда можете использовать кеш и т. д.

+0

Позвольте мне лучше объяснить, что я пытаюсь: каждый кадр, в который игрок перемещает вид камеры, отображает список рендеринга (NSMutableArray), и каждый объект проверяется, будет ли он все еще видимым или нет, помещая его в рендер список. Я начинаю считать, что процесс добавления/удаления объектов из NSMutableArray является дорогостоящим процессом и требует некоторой переоценки. Правильно ли это звучит? – Grimless

+2

Сколько у вас объектов в списке рендеринга? Да, вообще, полностью или полностью исключать объекты из списка рендеринга, а не просто перемещать их, будет дорого. Дело не в том, что добавление/удаление из изменчивого массива дорого, а потому, что оно дорого, когда вы делаете 100 объектов, потенциально десятки + раз в секунду! Это добавляет. – bbum

+0

Мой тестовый жгут показал, что, действительно, опорожнение и повторное добавление чрезвычайно трудоемки. Я обнаружил, что переход к «NSMutableSet» и проверка на включение перед действием дает значительно более быстрый результат. Спасибо за помощь! – Grimless

Смежные вопросы