1000万人のメンバーを使用したテスト条件下で、2番目の方法である単純なループの方が高速であることがわかりました。0秒対32秒です。メンバーが100万人の場合、0秒対3秒でした。これは、すべてのデータがメモリ内にあることを前提としており、RobNapierの経験と一致しています。テストコードは次のとおりです。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
NSMutableSet *testSet = [NSMutableSet set];
int i = 0;
while (i <10000000) {
[testSet addObject:[[TestObjects alloc] init]];
i++;
}
NSLog(@"%@",[NSDate date]);
NSNumber* sum = [testSet valueForKeyPath:@"@sum.myProperty"];
NSLog(@"%@",[NSDate date]);
NSLog(@"%@",sum);
NSLog(@"%@",[NSDate date]);
long long sum2 = 0;
for(TestObjects *obj in testSet)
sum2 += obj.myProperty;
NSLog(@"%@",[NSDate date]);
NSLog(@"%lld",sum2);
NSLog(@"%ld",testSet.count);
}
そして、TestObjectはinitにこれを持っていました:
-(id)init {
if (self = [super init]) {
self.myProperty = arc4random() %100;
}
return self;
}