2016-06-30 2 views
1

[containsObject:]を使用して特定のオブジェクトが含まれているNSSetをチェックするときと、[objectsPassingTest:最初にマッチした後に停止するようにYESにしますか?objectsPassingTestを使用してNSSetをチェックする際の速度の差異:vs containsObject:

また、セットにカスタムクラスのオブジェクトが含まれている場合、containsObjectがisEqual:メソッドを使用してチェックを実行するため、カスタムクラスでオーバーライドする必要があります。 NSStringにNSString、NSNumberなどのAppleクラスのオブジェクトが含まれている場合とは対照的に、containsObjectのチェックが遅くなりますか?

私はいくつかのベンチマークを実行する予定ですが、明日のインタビューがあり、その答えを得たいと思っています。

+1

これはプログラミング問題の問題ではないので、このトピックをオフトピックとして閉じることにしました。 – Avi

答えて

0

あなたが計画しているベンチマークを実行する必要がありますが、答えを推測できます。

containsObject:の実装では、各メンバーのisEqual:を呼び出すことがあります。 objectsPassingTest:の実装を繰り返して、各メンバーのブロックを呼び出すことができます。ブロック呼び出しisEqual: ...

私はあなたがそれに基づいて推測できると思います。インタビュアーがSOを読んでいても、面接を受けてください。

0

私はこの種のQsにも問題がありますが、私は(部分的に)答えます。そして、私は面接官が最終結果を得るとは思っていませんが、それについてのあなたの考えです。

両方とも-isEqual:でチェックします。しかし、-containsObject:は直接行うことができますが、-objectPassingTest:はブロックを呼び出す必要があります。これは高価ではないかもしれませんが、実行するコードが高価ではないため、パフォーマンスに影響を与える可能性があります。

この横の-containsObject:は、ハッシュを使用してオブジェクトを見つけることができます。 -objectPassingTest:NSSetにすることはできません。なぜなら、テストが何であるか分からないからです。ブロックは、オブジェクトを1つずつ取得するので、これを行うこともできません。

ただし、セット内に変更可能なオブジェクトがある場合、通常、カスタムクラスのどのオブジェクトでも、ハッシュ処理は実行できません。コレクション内の変更可能なオブジェクトに対して便利なハッシュを実装することはできません。

私の見積もり:正しく実装された-hash-containsObject:の不変のオブジェクトを持つと、それほど多くはないが、-objectPassingTest:になるでしょう。

関連する問題