iOS objc :: Производительность DenseMap - PullRequest
1 голос
/ 08 ноября 2011

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

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

1 Ответ

3 голосов
/ 08 ноября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...