2

用于初始化 NSCompoundPredicate 的数组中子谓词的顺序会影响效率吗?

例子:

NSString * str = [self getAStr];
NSManagedObject * mo = [self getAMo];
NSString * fmt = @"(stringAttribute ==[cd] %@) AND (relationships CONTAINS %@)";
NSString * fmt2 = @"relationships.@count != 0";
NSPredicate * p1 = [NSPredicate predicateWithFormat:fmt,str,mo];//expensive predicate
NSPredicate * p2 = [NSPredicate predicateWithFormat:fmt2,nil];//less expensive predicate
NSCompoundPredicate * cp = [NSCompoundPredicate andPredicateWithSubpredicates:@[p1,p2];
[self fetchSomethingWithPredicate:cp];

在上面的例子中,p1 和 p2 的顺序会改变复合谓词的计算方式吗?显然,首先评估 p2 会更有效,假设如果 p2 评估为 false,则 p1 将被忽略。

4

1 回答 1

2

是的,评估的顺序很重要。总是把最有效和限制性的谓词放在左边——尽可能快地取消资格(尽管记住一些谓词真的很昂贵)。

如果您中断调试器并打印出“cp”谓词,请确保它从左到右尽可能高效。

于 2012-11-21T01:26:27.043 回答