Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CoreData Sum Performance

I have some theoretical question to ask about Core Data and sum function.

I try to sum values from Core Data table with three ways.

  1. fetch all and use expression to sum it up :

    NSArray * array1 = [self getAll:self.managedObjectContext];
    int sum = [[array1 valueForKeyPath:@"@sum.sum"] intValue];
    
  2. fetch all and use for loop:

    int sum2 = 0;
    NSArray * array2 = [self getAll:self.managedObjectContext];
    
    for (Test * t in array2) {
        sum2 = sum2 + [t.sum intValue];
    }
    
  3. let Core Data sum it.

    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;
    }
    

surprisingly the

  1. way was the slowest (for 1.000.000 data --> 19.2 s), the
  2. way was faster (for 1.000.000 data --> 3.54 s) and the
  3. way was the fastest (for 1.000.000 data --> 0.3 s)

Why is this?

If I understand right even core data need to go through all 1.000.000 datas and sum it. Is this because use more cores if there are available?

like image 901
Marko Zadravec Avatar asked Oct 21 '22 14:10

Marko Zadravec


1 Answers

No CoreData doesn't do the summing on it's own - it delegates that to it's backing sqllite database which is optimized for things like that. Basically CoreData sends a select SUM(sum) from table; to it's db and it's performed there.

like image 87
rist Avatar answered Oct 30 '22 13:10

rist