使用NSDictionary valueForKey查找对象与通过NSArray进行迭代

Jan*_*edi 2 performance cocoa objective-c nsarray ios

我正在为一些图像开发一个简单的iOS缓存系统.我需要跟踪UIImage本身及其标识符.现在,我试图找出哪种方法可以更快/更有效地访问正确的缓存图像.

选项1:

for (CachedImage* image in [cachedImageArray]
{
  if ([[image identifier] isEqualToString:@"id_12345"]
  { 
    // use that image
  }
}
Run Code Online (Sandbox Code Playgroud)

选项2:

UIImage* imageToRetrieve = [cachedImagesDictionary objectForKey:@"id_12345"
Run Code Online (Sandbox Code Playgroud)

使用一种方法或另一种方法有什么好处吗?如果是这样,它是不可忽视的吗?谢谢.

car*_*ira 7

字典很可能会更快,因为它们会使用一些散列算法来提高检索效率(通常O(1)代替O(n)).如果缓存中的元素数量很大,它将是不可忽略的.

来自CFDictionary.h

计算复杂性
对于任何实现,当前和未来,字典中值的访问时间保证最差为O(lg N),但通常为O(1)(恒定时间).插入或删除操作通常也是恒定时间,但在某些实现中最坏的情况下是O(N*lg N).通过密钥访问值比直接访问值更快(如果有任何此类操作).字典将比具有相同数量的值的数组使用更多的内存.

  • 对于少量数据,性能差异可以忽略不计.对于大量条目,人们总能找到一些复杂的情况(哈希冲突),其中字典会更慢.所以@ H2CO3你赢了,我把它重写为不那么分类:) (2认同)

小智 5

使用一种方法或另一种方法有什么好处吗?

是.

UIImage *imageToRetrieve = [cachedImagesDictionary objectForKey:@"id_12345"];
Run Code Online (Sandbox Code Playgroud)

更可读.

(哦,你的意思是表现?不要担心.过早的优化是几乎所有邪恶的根源.)