NSDictionaryのキーその2
この前NSDictionaryのキーがNSStringじゃ無くてもOKって書いたけれど、NSNumberだと早いっていう記事を見かけた。ここは一つ実験
#pragma mark NSDictionary key part2 -(void)method024 { // static const int theCount = 50000; NSString *keyArr[theCount]; NSNumber *valArr[theCount]; NSNumber *valKeyArr[theCount]; int i; for (i = 0; i < theCount; i++) { keyArr[i] = [NSString stringWithFormat:@"key%d",i]; valArr[i] = [NSNumber numberWithInt:(theCount-i)]; valKeyArr[i] = [NSNumber numberWithInt:(theCount-i)]; } //NSDictionaryを作成 //キーがNSString NSDictionary *aDictionary = [NSDictionary dictionaryWithObjects:(id *)valArr forKeys:(id *)keyArr count:theCount]; //キーがNSNumber NSDictionary *bDictionary = [NSDictionary dictionaryWithObjects:(id *)valArr forKeys:(id *)valKeyArr count:theCount]; //NSLog(@"%s str %p = %@",__FUNCTION__,[aDictionary objectForKey:@"key49999"],[aDictionary objectForKey:@"key49999"]); //ナノ秒レベルの時間計測 //<mach/mach_time.h>が必要 //Saki さん Thanks! //http://blog.livedoor.jp/yousuke_saki/archives/51494672.html uint64_t start, elapsed; start = mach_absolute_time(); //↓計測対象 id aObj = [aDictionary objectForKey:@"key49999"]; //↑計測対象 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 bObj = [aDictionary objectForKey:[NSNumber numberWithInt:49999]]; //↑計測対象 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); //時間計測終了 }
iPhone4で実験
NSStringがキーだと 30416 31875 31333 (nano second)
NSNumberがキーだと 39750 40750 43291 (nano second)
うーん、そんなに速くないというか遅い。
なにか間違っているのだろうか。