NSArray containsObject:更快的替代方案?

时间:2013-02-15 12:35:38

标签: ios objective-c nsarray

我在使用Instruments的iOS应用程序上进行了一些运行,我发现启动时主线程上的90%负载(总共大约1000ms)是由containsObject:calls引起的。这是主线程,我不认为这很酷。

这种方法有更快的替代方案吗?算法或其他方法?

有什么建议吗?

更多信息:

  1. 我再次查看了我的代码,我意识到事实上我不需要知道对象的顺序,只有当一个对象是该集合的一部分时。这意味着NSSet会做得很好(我想更快)。

  2. 对象数量 - 该集合中可能有1000多个对象。

2 个答案:

答案 0 :(得分:11)

如果需要使用数组,请稍微向下跳过


替代选项

您的其他选择可能包括:

  • 使用NSDictionary使用key->值对(我希望)具有O(1)读取复杂度,代价是额外的密钥存储空间

  • 如果您没有使用重复项并且订单不重要,使用NSSet将提供更好的读取复杂性(我不知道复杂性会是什么,文档可能会)< / p>


使用数组

如果您对数组进行排序,则可以在O(log n)时间而不是O(n)进行搜索,因为您可以利用二进制搜索。

警告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];
}

答案 1 :(得分:0)

您可以比NSSet containsObject

更快地使用NSArray
相关问题