0

我有很多对象,每个对象都有一些标签,这些标签存储在 NSDictionary 中。我还有一个循环,在其中我遍历所有对象并根据对象的标签做一些事情。方法 objectForKey:如果调用太多,性能会大大降低。我怎样才能提高性能?例如,我尝试在@property 中设置“strong”而不是“copy”,但这并没有解决问题。谢谢!

编辑:

这是某种代码,当然,它比我项目中的代码简单得多。Profiler 说热点在 objectForKey: 中,而不是在 doSomeStuff: 中。可能是因为它的电话数量吗?标签的对象很少,每个对象大约10个,但是对象的数量相当大

。H:

@interface MyObject : NSObject

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

-(void)doSomeStuff;

@end

米:

@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;

使用此容器,您必须自己管理对象的保留/释放周期。您的 .m 文件也应该重命名为 .mm 以允许 Objective-C 和 C++ 编译。

您必须与 libstd++ 链接

于 2012-07-24T15:31:41.343 回答