我正在尝试追捕我在Core Data中看到的一件奇怪的事情。我在这里创建了一个展示问题的示例项目 - https://github.com/mattjgalloway/CocoaBugs/tree/master/CoreDataSlowSetters
我在Core Data建模对象上有两个不同的属性。一个使用动态创建的setter。一个使用自定义setter,它只做这个:
- (void)setCustom:(NSString *)custom {
[self willChangeValueForKey:@"custom"];
[self setPrimitiveCustom:custom];
[self didChangeValueForKey:@"custom"];
}
如果我使用每个setter进行测量,我发现自定义的设置器比自动设置器慢得多(慢约3倍)。
在该示例项目中,我正在执行以下紧密循环来显示问题:
for (int i = 0; i < 1000000; i++) {
Entity *entity = [Entity insertInManagedObjectContext:self.managedObjectContext];
entity.generic = @"something"; ///< Time profiler shows 6.3% time here
entity.custom = @"something"; ///< Time profiler shows 19.9% time here
}
[注意:我正在使用mogenerator,因此使用insertInManagedObjectContext:
辅助方法。]
还有其他人看过这个问题吗?我已经尝试查找自动生成的访问器所做的事情,它似乎不仅仅是我的自定义访问器。
我只是运气不好,如果您自己实施访问者,那么它只会是很多更慢?
我还没有提出雷达,但我很快就会做。
答案 0 :(得分:2)
我不认为提交雷达有一点意义。正如Martin指出的那样,生成的访问器无疑会有一些优化。
这遵循Apple最近一直强调的路径,不要创建自定义访问器。由于访问者只应访问其属性,因此没有理由再创建自定义属性。您想要将想要放入访问者的任何逻辑都应该放在其他地方。
现在你有数学支持该规则:)