在Core Data中,我应该首先使用限制性更强或限制性更低的谓词吗?

时间:2013-09-27 08:41:26

标签: objective-c core-data

-(NSPredicate *) predicateForExactMatch
{
    enum typeOfAutocompleteNew toc = [[self class] typeOfAutoComplete];
    NSPredicate * predictNameMatch=[NSPredicate predicateWithFormat:@"%K==[cd]%@",NSStringFromSelector(@selector(strNameofPlace)),self.strCurrentKeyword];
    NSPredicate * entryTypeNameMatch=[NSPredicate predicateWithFormat:@"%K==[cd]%@",NSStringFromSelector(@selector(strEntry)),@(toc)];
    NSPredicate * final = [NSCompoundPredicate andPredicateWithSubpredicates:@[predictNameMatch,entryTypeNameMatch]];
    return final;
}

哪一个更好?

    NSPredicate * final = [NSCompoundPredicate andPredicateWithSubpredicates:@[predictNameMatch,entryTypeNameMatch]];

    NSPredicate * final = [NSCompoundPredicate andPredicateWithSubpredicates:@[entryTypeNameMatch,predictNameMatch]];

这里,predictNameMatch肯定是限制性更强。最多1-2个是完全匹配。 entryTypeName匹配匹配25%的数据。

3 个答案:

答案 0 :(得分:2)

如果重要,请测试并测量它。

我怀疑一般 Martin R是正确的,但性能优化是一种黑暗艺术,唯一可以确定的方法是找出...

答案 1 :(得分:1)

我不能给你准确的参考,因为我在手机上写这个,但我相当确定在一些WWDC核心数据会议上建议首先放置最严格的谓词。

答案 2 :(得分:1)

最严格的谓词应该是第一位的。在像这样的复合谓词中,谓词从左到右进行计算,一旦结果已知,处理就结束。在你的情况下,你有一个逻辑AND,所以如果第一个谓词是假,第二个谓词将被跳过(因为它是不必要的)。所以,如果第一个谓词几乎没有任何匹配,那么你几乎不需要评估第二个谓词。

它与if条件中发生的快捷方式完全相同。如果您使用if (a && b),并且a为false,则不会评估b