我有一些关于 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
), - 方式更快(
对于 1.000.000 数据 --> 3.54 s
)和 - 方式是最快的(
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/