4

iOSアプリでARCを使用しています。私は以下の方法をプロファイルしました。アルゴリズムはひどく素朴で無駄ですが、77%の時間がとに費やされobjc_retainていobjc_releaseます。からユニットをフェッチするラインまで下がっていなければならないと思いますNSArray。ARCは毎回オブジェクトを保持してから解放するように注意しています。

私は情報に基づいたアドバイスを探しています:どうすればそれをエレガントに修正できますか?

-(CGFloat)getUncertaintyForUnits:(NSArray*)units Position:(MKMapPoint)position Zoom:(MKZoomScale)zoomScale {

    CGFloat closest = MAXFLOAT; 

    for (int i = 0; i < [units count]; i++) {
        Unit *units = (Unit*)[units objectAtIndex:i];

        CGFloat distance = [self distanceBetweenMapPoints:unit.mapPoint And:position];

        if (distance < closest) {
            closest = distance;
        }
    }

    CGFloat max = 100 / zoomScale;
    return  (1. - closest / max) * 0.9;
}
4

2 に答える 2

10

あなたは速い列挙を試みることができます:

for (Unit *unit in units) {
    CGFloat distance = [self distanceBetweenMapPoints:unit.mapPoint And:position];
    if (distance < closest) {
        closest = distance;
    }
}

高速列挙では配列全体がブロックされるため、これにより余分な保持/解放を回避できます。

高速列挙を使用することには、いくつかの利点があります。

  • 列挙は、たとえばNSEnumeratorを直接使用するよりもかなり効率的です。
  • 構文は簡潔です。
  • 列挙は「安全」です。列挙子にはミューテーションガードがあるため、列挙中にコレクションを変更しようとすると、例外が発生します。
于 2012-06-09T20:15:47.457 に答える
0

何らかの理由でメモリ管理オブジェクトが必要でない限り、より高速な代替手段の1つは、位置ポイントを通常のC配列(または構造体の配列)に格納することです。

Objective Cは、通常のANSI Cのスーパーセットです。OOPスーパーセット構造の利点が、オブジェクトランタイムメッセージングおよび内部ループでの管理のコストを上回らない場合があります。

于 2012-06-09T21:00:12.440 に答える