7

Instruments を使用して iOS アプリをいくつか実行したところ、起動時のメイン スレッドの負荷の 90% (合計約 1000 ミリ秒) が、containsObject: 呼び出しによって引き起こされていることがわかりました。それはメインスレッドにあり、クールだとは思いません。

この方法に代わるより速い方法はありますか? アルゴリズムまたは別の方法?

助言がありますか?

より詳しい情報:

  1. コードをもう一度調べたところ、オブジェクトがそのセットの一部である場合にのみ、実際にはオブジェクトの順序を知る必要がないことに気付きました。これは、NSSet が問題なく動作することを意味します (そして、私はその方が速いと思います)。

  2. オブジェクトの数 - そのセットには 1000 以上のオブジェクトが存在する可能性があります。

4

2 に答える 2

12

配列を使用する必要がある場合は、もう少し下にスキップしてください


代替オプション

その他のオプションには次のものがあります。

  • NSDictionaryキーの余分なストレージスペースを犠牲にして、O(1)の読み取り複雑さを持つ(私が予想する)キー->値ペアを使用するを使用する

  • 重複を使用しておらず、順序が重要でない場合は、を使用するNSSetと読み取りの複雑さが改善されます (複雑さがどうなるかはわかりませんが、ドキュメントはおそらくそうなります)


配列の使用

配列をソートしたままにしておくと、バイナリ検索を利用するO(log n)代わりに、時間内に検索を実行できます。O(n)

警告講師:これは記憶から書かれたものです

-(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];
}
于 2013-02-15T12:43:08.477 に答える
-1

You can use NSSet containsObject more faster than NSArray

于 2015-10-15T05:00:21.930 に答える