gpt4 book ai didi

ios - CoreData 总和性能

转载 作者:可可西里 更新时间:2023-11-01 05:54:32 25 4
gpt4 key购买 nike

我有一些关于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com