ios - CoreData 总和性能

标签 ios xcode performance core-data sum

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

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

  1. 获取所有内容并使用表达式对其进行总结:

    NSArray * array1 = [self getAll:self.managedObjectContext];
    int sum = [[array1 valueForKeyPath:@"@sum.sum"] intValue];
    
  2. 获取所有内容并使用 for 循环:

    int sum2 = 0;
    NSArray * array2 = [self getAll:self.managedObjectContext];
    
    for (Test * t in array2) {
        sum2 = sum2 + [t.sum intValue];
    }
    
  3. 让 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;
    }
    

令人惊讶的是

  1. 方式是最慢的(for 1.000.000 data --> 19.2 s),
  2. 方式更快(对于 1.000.000 数据 --> 3.54 s)和
  3. 方式是最快的(for 1.000.000 data --> 0.3 s)

这是为什么?

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

最佳答案

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

关于ios - CoreData 总和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21720695/

相关文章:

ios - 如何在 Swift 中更改 UILabel 的字体大小?

mysql - 为什么在 Node JS 中执行 Mysql 查询比直接执行 Mysql 查询慢得多?

c# - C# 中的高性能文件复制?

objective-c - 发出一个 block 并等待它完成

objective-c - 从 NSMutableArray 中删除对象

ios - 获取用户在 Cocoa-touch 上的位置

ios - 在 XCode 8 中切换到新 iPhone 后的 Provisioning Profile 问题

c# - 字典中按键识别速度

ios - iOS 中多个打开的 UIViewController 存在内存问题。 swift

ios - Facebook Connect Graph API 在成功分享到 Facebook 时收到通知