4

isEqualToArray実際どうなのか知りたい...

サイズ 160 の配列があり、それぞれに 11 エントリの辞書が含まれていますが、単純に最初の列 (行が変更された日付を含む) に基づいて比較を行うことができます。

これで、単純な for サイクルでそれを行うことができます。

        BOOL different = FALSE;
        for (int index = 0 ; index < [newInfo count] ; ++index)
            if (![[[oldInfo objectAtIndex:index] objectForKey:@"Update"] isEqual:[[newInfo objectAtIndex:index] objectForKey:@"Update"]]) {

                different = TRUE;
                break;
            }
        if (different) {
        }
        else
            NSLog(@"Contact information hasn't been updated yet");

または、組み込みの isEqualToArray メソッドを使用できます。

        if ([oldInfo isEqualToArray:newInfo])
            NSLog(@"Contact information hasn't been updated yet");
        else {
            NSLog(@"Contact information has been updated, saving new contact information");
            [newInfo writeToFile:path atomically:YES];
        }

ここで、セルごとisEqualToArrayに呼び出すだけだと仮定すると、for ループ メソッドは実行時間の 1/11 で実行されます (11 ではなく 1 つの列のみを比較する必要があります)。isEqualToisEqualToArray

たぶん、私は最適化に夢中になっているだけかもしれません... (実行時間が制限されている多くのコンテストに参加しており、後遺症を感じています)。

4

3 に答える 3

4

ドキュメントには次のように記載されています。

2 つの配列は、それぞれが同じ数のオブジェクトを保持し、各配列の特定のインデックスにあるオブジェクトがisEqual:テストを満たしている場合、等しい内容を持ちます。

基本的にあなたは正しいです。

設計の観点からisEqualToArray:は、コードが理解しやすくなるため、を選択するかBOOL hasUpdates、パフォーマンスが気になる場合は を導入します。これには、メモリに 2 つのコピーを保持する必要がないという追加の利点があります。

于 2013-08-26T11:52:22.290 に答える
2

多くの人が、パフォーマンスは実行されるソース ステートメントの数に比例し、isEqualToArray のような関数は同等の直接コード化されたループに比べて目がくらむほど高速であると誤解しているのではないかと思います。

実際、これらの API のコーダーは、少しスピードアップする (または使用できない内部インターフェイスにアクセスする) いくつかの「取引のトリック」を実際に知っている場合がありますが、追加のロジックを投入する必要がある場合と同じくらい頻繁です。気にしない「奇妙な」ケースを処理するか、単に API を「一般的な」ものにします。

したがって、ほとんどの場合、プログラム全体に最も合理的に適合し、ロジックを明確にするものに基づいて選択する必要があります。明示的なループの方がよい場合もあります。特に、論理の一部を利用できる場合 (たとえば、後で必要になる配列値の「最大」を取得するなど)、作業の重複を避けることができます。

また、複雑な API 関数 (isEqualToArray よりも複雑) がある場合、理解しているかどうかがよくわかりません。多くの場合、複雑な関数を処理するよりも、単純な方法でコーディングする方が適切です。コードが機能するようになったら、戻って複雑な API を使用するように「最適化」できます。

于 2013-08-26T20:53:00.883 に答える
-1

両方のオブジェクトが配列であることがわかっている場合、isEqualTo<Class>メソッドは for ループよりも高速に等価性をチェックできます。

isEqualTo<Class>等値の特定のチェックを提供するために使用されますisEqualToArray:。so は、配列に同じ数のオブジェクトが含まれていることを確認します。

isEqualToArrayしたがって、私の知る限り、2 つのオブジェクトが配列であることがわかっている場合は、より良いオプションであると言えます。

于 2013-08-26T12:27:18.573 に答える