我在使用Instruments的iOS应用程序上运行了一些运行,我发现启动时主线程上的90%负载(总共大约1000ms)是由containsObject:calls引起的.这是主线程,我不认为这很酷.
有什么建议?
更多信息:
>我再次查看了我的代码,我意识到事实上我不需要知道对象的顺序,只有当一个对象是该集合的一部分时.这意味着NSSet会做得很好(我想更快).
>对象数 – 该集合中可能有1000个对象.
解决方法
如果您需要使用阵列,请稍微向下跳过
替代选项
您的其他选择可能包括:
>使用NSDictionary,它使用key->值对(我希望)具有O(1)读取复杂性,代价是密钥的额外存储空间
>如果您没有使用重复项并且顺序不重要,使用NSSet将提供更好的读取复杂性(我不知道复杂性会是什么,文档可能会)
使用数组
如果对数组进行排序,则可以在O(log n)时间内进行搜索,而不是O(n),因为您可以利用二进制搜索.
Caveat Lector:这是从记忆中写的
-(void) /*adding*/ { int proposedIndex = 0; proposedIndex = [array indexOfObject:node inSortedRange:NSMakeRange(0,array.count) options:NSBinarySearchingInsertionIndex usingComparator: ^ NSComparisonResult(id obj1,id obj2) { if (obj1.valueToCompare < obj2.valueToCompare) return NSOrderedAscending; if (obj1.valueToCompare > obj2.valueToCompare) return NSOrderedDescending; else return NSOrderedSame; }]; [array insertObject:node atIndex:proposedIndex]; } -(id) /* Getting */ { int location = [array indexOfObject:node inSortedRange:NSMakeRange(0,array.count) options:NSBinarySearchingFirstEqual usingComparator: ^ NSComparisonResult(id obj1,id obj2) { if (obj1.valueToCompare < obj2.valueToCompare) return NSOrderedAscending; if (obj1.valueToCompare > obj2.valueToCompare) return NSOrderedDescending; else return NSOrderedSame; }]; if (location == NSNotFound) return nil; return [array objectAtIndex:location]; }