macOS/iOS API解説

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。2010年代に書かれた内容です。今後更新はありません。

目次

高速列挙

高速列挙(fast enumeration)
for ( i in collection ) {

}

解説

NSArray,NSSet,NSDictionaryなどNSFastEnumeratorプロトコルに準拠したオブジェクトで有効。

例文

高速列挙は本当に高速なのか試してみた。

#pragma mark NSArray:高速列挙は高速か?
-(void)method032
{
    NSArray *anArray = [NSArray arrayWithObjects:@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",@"aaa",@"bbb",@"ccc",@"ddd",nil];
	
	//Enumeratorを使う場合	
	id obj;
	NSEnumerator *aEnumerator;
	
	
	//ナノ秒レベルの時間計測
    //<mach/mach_time.h>が必要
    //Saki さん Thanks!
    //http://blog.livedoor.jp/yousuke_saki/archives/51494672.html
    uint64_t start, elapsed;
    start = mach_absolute_time();
    //↓計測対象
    aEnumerator = [anArray objectEnumerator];
    while ((obj = [aEnumerator nextObject]) != nil) {
		//NSLog(@"%@",(NSString *)obj);
	}
	//↑計測対象
    elapsed = mach_absolute_time() - start;
    mach_timebase_info_data_t base;
    mach_timebase_info(&base);
    uint64_t nsec1 = elapsed * base.numer / base.denom;
    NSLog(@"%llu nano second",nsec1);
    //時間計測終了
    
	
    start = mach_absolute_time();
    //↓計測対象
    //高速列挙を使う
	id fastObj;
	for (fastObj in anArray) {
		//NSLog(@"%@",(NSString *)fastObj);
	}
    
    //↑計測対象
    elapsed = mach_absolute_time() - start;
    //mach_timebase_info_data_t base;
    mach_timebase_info(&base);
    uint64_t nsec2 = elapsed * base.numer / base.denom;
    NSLog(@"%llu nano second",nsec2);
    
    NSLog(@"%.2f %%",(((float)nsec2/(float)nsec1))*100);
    //時間計測終了
    
    
}
//=> 27447 nano second
//=> 9503 nano second
//=> 34.62 %

本当に高速でした。