macOS/iOS API解説

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

目次

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)

うーん、そんなに速くないというか遅い。
なにか間違っているのだろうか。