0

次のように NSMutableDictionary を返す関数を最適化しようとしています:

 -(NSMutableDictionary *)getValuses{

    NSNumber *n1 = [NSNumber numberWithInt:-1];
    NSNumber *n2 = [NSNumber numberWithInt:-1];
    NSNumber *n3 = [NSNumber numberWithInt:-1];
    NSNumber *n4 = [NSNumber numberWithInt:-1];
    NSNumber *n5 = [NSNumber numberWithInt:-1];

    if (self.k1)
        n1 = self.k1;
    if (self.k2)
        n2 = self.k2;
    if (self.k3)
        n3 = self.k3;
    if (self.k4)
        n4 = self.k4;
    if (self.k5)
        n5 = self.k5;

    NSMutableDictionary * dictionary = [[NSMutableDictionary alloc]initWithObjectsAndKeys:n1,[NSNumber numberWithInt:2],n2,[NSNumber numberWithInt:3],n3,[NSNumber numberWithInt:4],n4,[NSNumber numberWithInt:5],n5,[NSNumber numberWithInt:6], nil];

    return dictionary;
}  

この関数をループで 1 000 000 回以上実行するため、最適化は適切です。それは機能しますが、私はそれを大幅に高速化したいと考えています。

4

5 に答える 5

1
-(NSMutableDictionary *)getValuses{

    NSNumber *n1 = [NSNumber numberWithInt:-1];
   NSMutableDictionary * dictionary = [[NSMutableDictionary alloc]initWithObjectsAndKeys:(self.k1)? self.k1:n1,[NSNumber numberWithInt:2],(self.k2)? self.k2:n1,[NSNumber numberWithInt:3],(self.k3)? self.k3:n1,[NSNumber numberWithInt:4],(self.k4)? self.k4:n1,[NSNumber numberWithInt:5],(self.k5)? self.k5:n1,[NSNumber numberWithInt:6], nil];

    return dictionary;
}

上記のコードを試してください....

于 2013-10-25T07:20:51.807 に答える
0

次のようなものを試すことができます(テストされていません):

-(NSMutableDictionary *)getValuses {
    NSNumber *n = [NSNumber numberWithInt:-1];
    NSMutableDictionary * dictionary = 
        [[NSMutableDictionary alloc] initWithObjectsAndKeys: 
            self.k1 ? self.k1 : n,[NSNumber numberWithInt:2],
            self.k2 ? self.k2 : n,[NSNumber numberWithInt:3]...
    return dictionary;
}
于 2013-10-25T07:24:05.677 に答える
0

これを試して!dispatch_appy メソッドは、ループを作成し、同時キュー内のコードを実行するためのものです。これは、大きなループを実行するためのより良い方法です。

dispatch_apply ブロック - Apple ドキュメント

私はそれをコンパイルしませんでしたが、動作するはずです。手がかりを与えるのに役立つことを願っています。幸運を!

-(NSMutableDictionary *)getValuses{

    //add the values here
    NSMutableArray *array = [@[self.k1,self.k2,self.k3,self.k4,self.k5]mutableCopy];
    NSMutableDictionary * dictionary = [@{}mutableCopy];

    //this kind of block is better for big loops...
    size_t count = array.count;
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_apply(count, queue, ^(size_t i) {
        id value = [array objectAtIndex:i];
        [dictionary setObject:value?value:(@-1) forKey:@(i)];
    });

    return dictionary;
}
于 2013-10-25T07:59:47.790 に答える