高速列挙
高速列挙(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 %
本当に高速でした。