0

私はたくさんのオブジェクトを持っています、それぞれがNSDictionaryに保存されているいくつかのタグを持っています。また、ループがあり、すべてのオブジェクトを反復処理し、オブジェクトのタグに応じていくつかの処理を実行します。メソッドobjectForKey:呼び出しが多すぎると、パフォーマンスが大幅に低下します。どうすればパフォーマンスを向上させることができますか?たとえば、@ propertyに「copy」ではなく「strong」を設定してみましたが、問題は解決しませんでした。ありがとう!

編集:

これはある種のコードです。もちろん、私のプロジェクトのコードよりもはるかに単純です。プロファイラーによると、ホットスポットはdoSomeStuff:ではなくobjectForKey:にあります。それはその呼び出しの量のためである可能性がありますか?タグにはオブジェクトがほとんどなく、オブジェクトごとに約10個ありますが、オブジェクトの数はかなり多くなります

.h:

@interface MyObject : NSObject

@property (nonatomic, readwrite, strong/*copy*/  ) NSDictionary *tags;

-(void)doSomeStuff;

@end

.m:

@implementation MyObject
{
    NSDictionary *tags; // about 10 values for each object
}


-(NSDictionary *)tags
{
    return tags;
}

-(void)setTags:(NSDictionary *)newTags
{
    tags = [newTags copy];
}

-(void)doSomeStuff;

@end

使用:

NSArray *objects = ... // a lot of items, > 1000
NSArray *rules = ... // NSArray of objects with property NSArray* Strings, about 50 strings

for (MyObject *object in objects)
{
    for (NSArray *rule in rules)
    {
        for (NSString *ruleString in rule.Strings)
        {
            // there is a more complicated check in my project, so you may imagine that there are 10 calls of objectForKey:, with different keys
            if ([object objectForKey:ruleString] isEqualToString:@"yes"])
            {
                [object doSomeStuff];
            }
        }
    }
}
4

2 に答える 2

3

遅い場合は、追加するオブジェクトobjectForKeyのカスタム(より効率的な)実装を作成するのが最善の策かもしれません。hashデフォルトの実装では、パフォーマンスに影響を与える可能性のある多くの衝突が発生している可能性があります。

そうは言っても、追加するオブジェクトの数、オブジェクトで何をしているのか、どの環境を使用しているのかはわかりません。推測以上に言うのは難しい。一般的に、NSDictionaryはかなり効率的です。

編集:あなたが追加した追加情報に基づいて明確にするために...これはNSDictionaryのパフォーマンスを改善することではないと思います。あなたの番号を考えると、あなたはobjectForKey:50万回以上電話をかけています。もちろん、これは最も要求の厳しい操作になります。すでに非常にわずかに高速なものを作成しようとするのではなく、アルゴリズムの最適化(事前計算?)について考える必要があります。

于 2012-04-10T12:10:09.500 に答える
0

hash_map のような高速な標準ライブラリ コンテナーを使用する必要があります。

#include <string>
#include <ext/hash_map>

typedef __gnu_cxx::hash_map<std::string,id> YouMap;

このコンテナーを使用して、オブジェクトの保持/解放サイクルを自分で管理する必要があります。Objective-C と C++ の両方のコンパイルを可能にするために、.m ファイルの名前も .mm に変更する必要があります。

libstd++ とリンクする必要があります

于 2012-07-24T15:31:41.343 に答える