2011-11-07 16 views
1

私はiOS 5プロジェクトに取り組んでおり、厳しいパフォーマンスの問題にぶつかって、アプリを< 10fpsに一貫して減らしています。時間プロファイリングツールは、Objective-Cランタイムのretain/release/autoreleaseシステムと関係があると思われるobjc::DenseMapへの呼び出しを識別しました。この呼び出しは処理時間の膨大な部分を占めており、誰かがこの罰則やこの問題を回避する方法を解決するための指針を持っているのだろうかと思っていました。私はそれがNSMutableArrays、NSMutableSets、およびフレームごとのオブジェクトを管理するために使用している他の変更可能なコレクションと関係があると考えています。これを追跡し、それを解決するためのアドバイスや洞察力があれば幸いです。以下は、重要で適切と思われるトレース内のすべてです。iOS objc :: DenseMap performance

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

パフォーマンス分析からシステムライブラリを除外し、その内容を確認してください。あなたはスタックの間違った端を見ている。

あなたのコードは、通常、特定のアプリケーションを作成するために必要な方法でシステムフレームワークを一緒に接着する比較的薄いベニアです。このようなパフォーマンスの問題は、アプリの実装がアルゴリズム的には機能していないことを最もよく示します。おそらくあなたはあまり頻繁に物を再cacluatingしているかもしれません。おそらく、あなたがキャッシュなどを使用していたときにコレクションを空にしている/充填しています。

+0

私が試していることをより良く説明できるようにする:プレイヤーがカメラのビューを動かすたびに、レンダーリスト(NSMutableArray)が空になり、各オブジェクトがまだ可視かどうかを確認してレンダリングに配置するリスト。私は、NSMutableArrayからオブジェクトを追加/削除するプロセスが高価なプロセスであり、再評価が必要であると考え始めています。それは正しいと思いますか? – Grimless

+2

レンダーリストにはいくつのオブジェクトがありますか?はい、一般的に、単にオブジェクトを移動するのではなく、レンダリングリストの内外にオブジェクトを取り込むのは高価になります。変更可能なアレイからの追加/削除が高価ではないので、潜在的に数十回/秒のオブジェクトを100秒実行すると高価になります。それは合計する。 – bbum

+0

私のテストハーネスは、実際に空にして再追加するのは非常に時間がかかることを示しています。私は 'NSMutableSet'に移動し、動作する前にインクルードをチェックするとかなり高速な結果が得られることが分かりました。助けてくれてありがとう! – Grimless