32

NSDictionary にキーが存在するかどうかは、次の 2 つの方法でテストできます。

BOOL containsKey = [[dictionary allKeys] containsObject:foo];

BOOL containsKey = ([dictionary objectForKey:foo] != nil);

どちらの方法がより高速で、その理由は?

4

3 に答える 3

68

ハッシュルックアップは、すべての辞書キーを調べて、それらから配列を作成し (メモリ割り当ては比較的高価です)、配列を検索するよりも一般的に高速です (配列がソートされていないため、バイナリ検索でさえできません)。 .

ただし、科学のために、各スタイルを 100 万回実行する 2 つの実行可能ファイルを作成し、それらの時間を測定しました。

すべてのキーを使用:

real    0m4.185s
user    0m3.890s
sys     0m0.252s

objectForKey を使用:

real    0m0.396s
user    0m0.189s
sys     0m0.029s

明らかに、辞書のサイズ、allKeys 戻り値のキャッシュなど、さまざまな要因がこれに影響を与える可能性があります。ただし、配列検索が辞書検索よりも高速であるとは思いません。

于 2009-05-06T20:36:58.007 に答える
6

allKeys 配列を要求する方が高速になる可能性があるかどうかはわかりません。それ以外の場合、NSDictionary は少なくとも内部で同等のことを行います。

編集:たとえば、キーのメソッドではallKeys時間がかかりますが、メソッドでは時間がかからないため、メソッドが高速になるケースを構築できると思います。また、それらがスワップされるクレイジーな実装をスワップすることもできます (抽象的であるため)。hashisEqual:NSDictionaryNSDictionary

于 2009-05-06T20:21:29.353 に答える
2

このようなパフォーマンスの問題について考えるときは、Foundation データ クラスは、格納するオブジェクトの数に応じて、基礎となるデータ構造を交換することに注意してください。たとえば、小さな NSArray は、特定のサイズに達するまで、実際にはハッシュ テーブルをストレージとして使用していると思います。

于 2009-05-06T21:27:38.663 に答える