检查NSDictionary是否包含特定键的哪种方法更快?

时间:2009-05-06 20:15:57

标签: cocoa performance nsdictionary

我可以通过两种方式测试NSDictionary中是否存在密钥:

BOOL containsKey = [[dictionary allKeys] containsObject:foo];

BOOL containsKey = ([dictionary objectForKey:foo] != nil);

哪种方法更快,为什么?

3 个答案:

答案 0 :(得分:68)

散列查找一般应该比遍历所有字典键更快,从它们创建一个数组(内存分配相对昂贵)然后搜索数组(由于数组是,所以甚至不能进行二进制搜索没有排序)。

为了科学,我制作了两个可执行文件,只执行每种风格100万次并计时。

使用allKeys:

real    0m4.185s
user    0m3.890s
sys     0m0.252s

使用objectForKey:

real    0m0.396s
user    0m0.189s
sys     0m0.029s

显然,各种因素都会影响这个 - 字典的大小,缓存allKeys返回值等等。我不希望有一种情况,即数组搜索比字典查找更快。

答案 1 :(得分:6)

我没有看到如何要求allKeys数组可能更快,否则NSDictionary至少会在内部执行相同的操作。

编辑:我认为您可以构建一个allKeys方法更快的案例 - 在您的密钥的hash方法中花费很长时间,而不是在isEqual:方法中, 例如。而且你也可以为交换它们的NSDictionary交换一个疯狂的实现(因为NSDictionary是抽象的。)

答案 2 :(得分:2)

在考虑这样的性能问题时,请记住,Foundation数据类会根据您存储在其中的对象数量来交换其基础数据结构。例如,我认为一个小的NSArray实际上使用哈希表进行存储,直到它达到一定的大小。