2011-11-07 44 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

您在渲染列表中有多少個對象?是的,一般來說,完全將物體放入/放出渲染列表,而不是僅僅移動它們,將是昂貴的。與可變數組中的添加/刪除操作相比,它的價格並不昂貴,因爲當您執行數百次潛在的數十次以上的對象時,代價非常昂貴!它加起來。 – bbum

+0

我的測試工具已經證明,的確,清空和重新添加是非常耗時的。我發現移動到「NSMutableSet」並在執行之前檢查包含是否會產生相當快的結果。謝謝您的幫助! – Grimless