Эффективное хранение частичных результатов в NSMutableDictionary - PullRequest
0 голосов
/ 19 августа 2011

target_results является NSMutableDictionary.Это эффективный способ хранения частичных сумм в списке?Можете ли вы предложить какие-либо улучшения?

NSInteger temp_key = [rs intForColumn:@"some_int_field"];
NSInteger existing_value = [[target_results objectForKey:[NSNumber numberWithInteger:temp_key]] intValue];

if (existing_value > 0)
{
    //add to existing
    [target_results setObject:[NSNumber numberWithInteger:10+existing_value] forKey:[NSNumber numberWithInteger:temp_key]];
}
else
{
     //new entry
[target_results setObject:[NSNumber numberWithInteger:10] forKey:[NSNumber numberWithInteger:temp_key]];
}

1 Ответ

3 голосов
/ 19 августа 2011

Самый правильный способ оптимизации - это профилировать и находить фактические узкие места, если таковые имеются.Тем не менее, работая из первых принципов ...

Во-первых, нет необходимости вызывать NSNumber дважды (три раза в коде, дважды во время выполнения).Каждый вызов создает новый объект, поэтому для этого требуется дополнительная память.Таким образом, это сокращение до:

NSInteger temp_key_int = [rs intForColumn:@"some_int_field"];
NSNumber *temp_key = [NSNumber numberWithInteger:temp_key_int];

NSInteger existing_value = [[target_results objectForKey:temp_key] intValue];

if (existing_value > 0)
{
    //add to existing
    [target_results setObject:[NSNumber numberWithInteger:10+existing_value] forKey:temp_key];
}
else
{
     //new entry
[target_results setObject:[NSNumber numberWithInteger:10] forKey:temp_key];
}

Оператор if также, похоже, ничего не добивается.Таким образом, вы можете дополнительно уменьшить код до:

NSInteger temp_key_int = [rs intForColumn:@"some_int_field"];
NSNumber *temp_key = [NSNumber numberWithInteger:temp_key_int];

// will create a new entry or replace an existing entry, as per the normal behaviour
// of NSMutableDictionary
NSInteger existing_value = [[target_results objectForKey:temp_key] intValue];
[target_results setObject:[NSNumber numberWithInteger:10+existing_value] forKey:temp_key];

Я серьезно сомневаюсь, что вы увидите какие-либо проблемы с производительностью с этим или с оригинальным кодом.Однако вы описываете свою структуру данных как список, поэтому вы можете рассмотреть возможность использования NSMutableArray вместо словаря, предполагая, что вы можете поместить шаг инициализации.

...