我可以通过两种方式测试NSDictionary中是否存在密钥:
BOOL containsKey = [[dictionary allKeys] containsObject:foo];
BOOL containsKey = ([dictionary objectForKey:foo] != nil);
哪种方法更快,为什么?
答案 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实际上使用哈希表进行存储,直到它达到一定的大小。