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 が false と評価された場合に p1 が無視されると仮定すると、明らかに最初に p2 を評価する方が効率的です。

4

1 に答える 1

2

はい、評価の順序は重要です。常に最も効率的で制限のある述語を左側に配置します-できるだけ早く失格にします(ただし、一部の述語は非常に高価であることに注意してください)。

デバッガーに侵入して「cp」述語を出力する場合は、左から右に、可能な限り効率的であることを確認してください。

于 2012-11-21T01:26:27.043 に答える