Ios NSArray containsObject:更快的替代方案?
我用Instruments在我的iOS应用程序上运行了几次,我发现启动时主线程上90%的负载(总共约1000毫秒)是由containsObject:calls引起的。这是主线,我不认为这很酷 有没有比这种方法更快的替代方法?一种算法还是另一种方法 有什么建议吗 更多信息:Ios NSArray containsObject:更快的替代方案?,ios,objective-c,nsarray,Ios,Objective C,Nsarray,我用Instruments在我的iOS应用程序上运行了几次,我发现启动时主线程上90%的负载(总共约1000毫秒)是由containsObject:calls引起的。这是主线,我不认为这很酷 有没有比这种方法更快的替代方法?一种算法还是另一种方法 有什么建议吗 更多信息: 我再次查看了我的代码,我意识到事实上我不需要知道对象的顺序,只要对象是该集合的一部分。这意味着NSSet会做得很好(我想会更快) 对象数量-该集合中可能有1000多个对象 如果需要使用数组,请往下跳一点 备选方案 您的其他选
如果需要使用数组,请往下跳一点
备选方案 您的其他选择可能包括:
- 使用一个
,它使用键->值对(我预计)具有O(1)读取复杂性,但代价是为键提供额外的存储空间NSDictionary
- 如果您不使用副本,并且顺序也不重要,那么使用
将提供更好的阅读复杂性(我不知道复杂性是什么,文档可能会)NSSet
使用数组 如果您保持数组排序,则可以在
O(logn)
时间内完成搜索,而不是O(n)
,因为您可以利用二进制搜索
警告选择器:这是从内存中写入的
-(void)/*添加*/
{
int proposedIndex=0;
proposedIndex=[array indexOfObject:节点
inSortedRange:NSMakeRange(0,array.count)
选项:NSBinarySearchingInsertionIndex
使用比较器:
^N比较结果(id obj1,id obj2)
{
如果(obj1.valueToCompareobj2.valueToCompare)返回降级;
否则返回DeredName;
}];
[数组插入对象:节点索引:proposedIndex];
}
-(id)/*获得*/
{
int location=[array indexOfObject:node
inSortedRange:NSMakeRange(0,array.count)
选项:NSBinarySearchingFirstEqual
使用比较器:
^N比较结果(id obj1,id obj2)
{
如果(obj1.valueToCompareobj2.valueToCompare)返回降级;
否则返回DeredName;
}];
if(location==NSNotFound)返回nil;
返回[array objectAtIndex:location];
}
您可以使用NSSet containsObject
比NSArray
更快NSSet
对于这类事情不是更好地优化了吗?你可能想开发你自己的hash
方法(和equals:
,因为他们是一对。我会研究一下!作为旁注,数组有多大?我没有意识到,但是containsObject
的文档说它将检查数组的所有成员,这听起来有点令人困惑,所以我希望文档是错误的。@NikolayDyankov请记住,集合还需要不同的(非重复的)值。这是真的吗?是的,它们肯定都是独一无二的。这些对象是从核心数据中提取的,只有在提取的数组/集合中不存在这样的对象时,才会插入新的对象。这种检查在启动时会做很多次,因此通过发出请求来检查对象是否存在于核心数据中不是一个选项。最初我认为NSSet在搜索对象时比NSArray有更好的性能,但是即使NSSet迭代所有对象并检查它是否存在,这与NSArray相同。摘自NSSet文档-检查集合中的每个元素是否与某个对象相等,直到找到匹配项或到达集合的末尾。如果isEqual:返回YES,则认为对象相等。
-(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];
}