核心数据总和性能

Mar*_*vec 5 performance xcode sum core-data ios

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

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

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

    NSArray * array1 = [self getAll:self.managedObjectContext];
    int sum = [[array1 valueForKeyPath:@"@sum.sum"] intValue];
    
    Run Code Online (Sandbox Code Playgroud)
  2. 获取所有并使用 for 循环:

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

令人惊讶的是

  1. 方式是最慢的(for 1.000.000 data --> 19.2 s),
  2. 方式更快 ( for 1.000.000 data --> 3.54 s) 并且
  3. 方式是最快的 ( for 1.000.000 data --> 0.3 s)

为什么是这样?

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

小智 3

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