我正在为一些图片开发一个简单的iOS缓存系统。我需要跟踪UIImage本身及其标识符。现在,我试图找出哪种方法可以更快/更有效地访问正确的缓存图像。
选项1:
for (CachedImage* image in [cachedImageArray]
{
if ([[image identifier] isEqualToString:@"id_12345"]
{
// use that image
}
}
选项2:
UIImage* imageToRetrieve = [cachedImagesDictionary objectForKey:@"id_12345"
使用一种方法或另一种方法有什么好处吗?如果是这样,它是不可忽视的吗?感谢。
答案 0 :(得分:7)
字典很可能会更快,因为它们会使用一些散列算法来提高检索效率(通常是O(1)
而不是O(n)
)。如果缓存中的元素数量很大,它将是不可忽略的。
计算复杂性
字典中值的访问时间保证为 任何实施,当前和未来的最差O(lg N),但会 通常是O(1)(恒定时间)。插入或删除操作 通常也是恒定的时间,但是在O(N * lg N)中 在一些实现中的最坏情况。通过密钥访问值 比直接访问值更快(如果有的话) 操作)。字典将倾向于使用更多的内存 而不是具有相同数量值的数组。
答案 1 :(得分:5)
使用一种方法或另一种方法有什么好处吗?
是。
UIImage *imageToRetrieve = [cachedImagesDictionary objectForKey:@"id_12345"];
更具可读性。
(哦,你的意思是表现?不要担心。过早的优化是几乎所有邪恶的根源。)
答案 2 :(得分:1)
就像H2CO3所说,我选择选项2以便于阅读。
但是,如果它真的是一个缓存(即如果内存紧张,你很高兴操作系统自动从缓存中删除对象),我会使用NSCache
而不是NSDictionary
:
// Setup the cache
UIImage *myImage = [UIImage imageNamed:@"blah"];
NSCache *imageCache = [[NSCache alloc] init];
[imageCache setObject:myImage forKey:@"id_12345"];
// Sometime later...
UIImage* imageToRetrieve = [imageCache objectForKey:@"id_12345"];