へろへろもへじ

(ブログタイトル募集中)

【Objective-C,iOS】配列のパフォーマンス検証

Objective-Cの配列は遅いからCの配列を使った方がいい」という話をちょろっと小耳に挟んだので、「え、マジで。。高速列挙で記述すれば最適化されるって聞いたからそんなに変わらないんじゃ...」って思ったので検証してみました。

◆検証時の条件と環境
・サンプリング数を1000000とし、要素(数値)を取り出すのにかかる時間を計測
・OSX 10.8.2
XCode 4.5.2

■[C]ループ

    int counter = 1000000;
    
    int array[counter];
    for (int i = 0; i < counter; i++) {
        array[i] = i;
    }
    
    NSDate *start = [NSDate dateWithTimeIntervalSinceNow:0.0];
    for (int i = 0; i < counter; i++) {
        int temp = array[i];
    }
    NSDate *end = [NSDate dateWithTimeIntervalSinceNow:0.0];
    NSLog(@"test1 = %1.3f", [end timeIntervalSinceDate:start]);

■[ObjC]高速列挙

    NSMutableArray *array2 = [[NSMutableArray alloc] initWithCapacity:counter];
    for (int i = 0; i < counter; i++) {
        [array2 addObject:[NSNumber numberWithInt:i]];
    }
    
    start = [NSDate dateWithTimeIntervalSinceNow:0.0];
    for (NSNumber *num in array2) {
    }
    end = [NSDate dateWithTimeIntervalSinceNow:0.0];
    NSLog(@"test2 = %1.3f", [end timeIntervalSinceDate:start]);

一応、配列の要素数でループするパターンも2パターン試してみました。

■[ObjC]要素数を初回に取得するループ

    start = [NSDate dateWithTimeIntervalSinceNow:0.0];
    for (int i = 0,len = array2.count; i < len; i++) {
        NSNumber *num = [array2 objectAtIndex:i];
    }    
    end = [NSDate dateWithTimeIntervalSinceNow:0.0];
    NSLog(@"test3 = %1.3f", [end timeIntervalSinceDate:start]);

■[ObjC]要素数を都度取得するループ

    start = [NSDate dateWithTimeIntervalSinceNow:0.0];
    for (int i = 0; i < array2.count; i++) {
        NSNumber *num = [array2 objectAtIndex:i];
    }
    end = [NSDate dateWithTimeIntervalSinceNow:0.0];
    NSLog(@"test4 = %1.3f", [end timeIntervalSinceDate:start]);

結果は以下の通りとなりました。

[C]ループ [ObjC]高速列挙 [ObjC]要素数を初回に取得するループ [ObjC]要素数を都度取得するループ
0.002sec 0.005sec 0.012sec 0.019sec

これを見る限りだと高速列挙を使っておけば大差ないので、わざわざCの配列使わなくてもいいかなーとか思っちゃいました。扱うデータやサンプリング数を変える等して実験をいくつか試してみないと一概には言えないですが。。うん、でもたぶん使わないです。

あと数分でクリスマスイブですね。それではメリークリスマス☆