Nik*_*kov 7 objective-c nsarray ios
我在使用Instruments的iOS应用程序上运行了一些运行,我发现启动时主线程上的90%负载(总共大约1000ms)是由containsObject:calls引起的.这是主线程,我不认为这很酷.
这种方法有更快的替代方案吗?算法或其他方法?
有什么建议?
更多信息:
我再次查看了我的代码,我意识到事实上我不需要知道对象的顺序,只有当一个对象是该集合的一部分时.这意味着NSSet会做得很好(我想更快).
对象数量 - 该集合中可能有1000多个对象.
Jam*_*ter 12
如果您需要使用阵列,请稍微向下跳过
您的其他选择可能包括:
使用一个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];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2878 次 |
| 最近记录: |