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

alf*_*att 32 performance cocoa nsdictionary

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

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

BOOL containsKey = ([dictionary objectForKey:foo] != nil);
Run Code Online (Sandbox Code Playgroud)

哪种方法更快,为什么?

Chu*_*uck 68

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

然而,为了科学,我制作了两个可执行文件,只执行每个样式100万次并计时.

使用allKeys:

real    0m4.185s
user    0m3.890s
sys     0m0.252s
Run Code Online (Sandbox Code Playgroud)

使用objectForKey:

real    0m0.396s
user    0m0.189s
sys     0m0.029s
Run Code Online (Sandbox Code Playgroud)

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

  • +1用于时尚地制作章节和诗句 (5认同)

Jes*_*sak 6

我不知道如何要求allKeys数组可能更快,否则NSDictionary至少会在内部执行相同的操作.

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