NSDictionary にキーが存在するかどうかは、次の 2 つの方法でテストできます。
BOOL containsKey = [[dictionary allKeys] containsObject:foo];
BOOL containsKey = ([dictionary objectForKey:foo] != nil);
どちらの方法がより高速で、その理由は?
NSDictionary にキーが存在するかどうかは、次の 2 つの方法でテストできます。
BOOL containsKey = [[dictionary allKeys] containsObject:foo];
BOOL containsKey = ([dictionary objectForKey:foo] != nil);
どちらの方法がより高速で、その理由は?
ハッシュルックアップは、すべての辞書キーを調べて、それらから配列を作成し (メモリ割り当ては比較的高価です)、配列を検索するよりも一般的に高速です (配列がソートされていないため、バイナリ検索でさえできません)。 .
ただし、科学のために、各スタイルを 100 万回実行する 2 つの実行可能ファイルを作成し、それらの時間を測定しました。
すべてのキーを使用:
real 0m4.185s
user 0m3.890s
sys 0m0.252s
objectForKey を使用:
real 0m0.396s
user 0m0.189s
sys 0m0.029s
明らかに、辞書のサイズ、allKeys 戻り値のキャッシュなど、さまざまな要因がこれに影響を与える可能性があります。ただし、配列検索が辞書検索よりも高速であるとは思いません。
allKeys 配列を要求する方が高速になる可能性があるかどうかはわかりません。それ以外の場合、NSDictionary は少なくとも内部で同等のことを行います。
編集:たとえば、キーのメソッドではallKeys
時間がかかりますが、メソッドでは時間がかからないため、メソッドが高速になるケースを構築できると思います。また、それらがスワップされるクレイジーな実装をスワップすることもできます (抽象的であるため)。hash
isEqual:
NSDictionary
NSDictionary
このようなパフォーマンスの問題について考えるときは、Foundation データ クラスは、格納するオブジェクトの数に応じて、基礎となるデータ構造を交換することに注意してください。たとえば、小さな NSArray は、特定のサイズに達するまで、実際にはハッシュ テーブルをストレージとして使用していると思います。