2014-02-12 28 views
3

我有一些理论问题要问关于核心数据和总和函数。CoreData总结性能

我尝试总结核心数据表中有三种方法的值。

  1. 获取所有和使用的表达来概括:

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

    int sum2 = 0; 
    NSArray * array2 = [self getAll:self.managedObjectContext]; 
    
    for (Test * t in array2) { 
        sum2 = sum2 + [t.sum intValue]; 
    } 
    
  3. 让核心数据总结一下。

    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. 方法是更快的(for 1.000.000 data --> 3.54 s)和
  3. 方式是最快(for 1.000.000 data --> 0.3 s

这是为什么?

如果我理解的话,即使是核心数据也需要经过所有的1.000.000数据并加以总结。这是因为如果可用,使用更多的内核?

回答

2

没有CoreData没有对它自己进行总结 - 它委托它支持sqllite数据库,该数据库针对这类事情进行了优化。 基本上CoreData发送一个select SUM(sum) from table;它的数据库,它在那里执行。

+0

你知道为什么1.方式比2.-one慢吗? –

+0

@MarkoZadravec你是否在同一个上下文中按顺序执行1和2? –

+1

我假设1比2慢,因为直接属性访问可能很快,然后通过键值编码进行属性访问 – rist