CoreData 总和性能

Posted

技术标签:

【中文标题】CoreData 总和性能【英文标题】:CoreData Sum Performance 【发布时间】:2014-02-12 06:51:06 【问题描述】:

我有一些关于 Core Data 和 sum 函数的理论问题要问。

我尝试用三种方式对 Core Data 表中的值求和。

    全部提取并使用表达式总结:

    NSArray * array1 = [self getAll:self.managedObjectContext];
    int sum = [[array1 valueForKeyPath:@"@sum.sum"] intValue];
    

    获取所有并使用 for 循环:

    int sum2 = 0;
    NSArray * array2 = [self getAll:self.managedObjectContext];
    
    for (Test * t in array2) 
        sum2 = sum2 + [t.sum intValue];
    
    

    让 Core Data 总结一下。

    NSArray * array = [self getAllGroupe:self.managedObjectContext];
    NSDictionary * i = [array objectAtIndex:0];
    id j = [i objectForKey:@"sum"];
    
    (NSArray *)getAllGroupe:(NSManagedObjectContext*)Context
    
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Test"  
                                       inManagedObjectContext:Context];
    
        NSExpressionDescription* ex = [[NSExpressionDescription alloc] init];
        [ex setExpression:[NSExpression expressionWithFormat:@"@sum.sum"]];
        [ex setExpressionResultType:NSDecimalAttributeType];
        [ex setName:@"sum"];
    
    
        [fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:ex, nil]];
        [fetchRequest setResultType:NSDictionaryResultType ];
    
    
        NSError *error;
        [fetchRequest setEntity:entity];
        NSArray *fetchedObjects = [Context executeFetchRequest:fetchRequest error:&error];
    
    return fetchedObjects;
    
    

令人惊讶的是

    方式是最慢的(for 1.000.000 data --> 19.2 s), 方式更快(for 1.000.000 data --> 3.54 s)和 方式是最快的 (for 1.000.000 data --> 0.3 s)

这是为什么呢?

如果我理解正确,即使核心数据也需要遍历所有 1.000.000 数据并求和。这是因为如果有可用的内核就使用更多的内核吗?

【问题讨论】:

【参考方案1】:

没有 CoreData 不会自己进行求和 - 它会将其委托给它的支持 sqllite 数据库,该数据库已针对此类事情进行了优化。 基本上 CoreData 会向它的数据库发送一个select SUM(sum) from table; 并在那里执行。

【讨论】:

你知道为什么 1. way 比 2.-one 慢吗? @MarkoZadravec 您是否在同一上下文中按顺序执行 1 和 2? 我假设 1 比 2 慢,因为直接属性访问可能比通过键值编码的属性访问快

以上是关于CoreData 总和性能的主要内容,如果未能解决你的问题,请参考以下文章

使用 CoreData 关系计算摘要

一般 CoreData 性能

CoreData 排序实体 - 性能

CoreData - 在实体上有许多关系时的性能

CoreData - 按关系批量获取对象以获得更好的性能

CoreData 性能重复实体与属性