自定义访问器比Core Data中的自动访问器慢得多

时间:2014-01-09 12:10:12

标签: ios objective-c core-data

我正在尝试追捕我在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:辅助方法。]

还有其他人看过这个问题吗?我已经尝试查找自动生成的访问器所做的事情,它似乎不仅仅是我的自定义访问器。

我只是运气不好,如果您自己实施访问者,那么它只会是很多更慢?

我还没有提出雷达,但我很快就会做。

1 个答案:

答案 0 :(得分:2)

我不认为提交雷达有一点意义。正如Martin指出的那样,生成的访问器无疑会有一些优化。

这遵循Apple最近一直强调的路径,不要创建自定义访问器。由于访问者只应访问其属性,因此没有理由再创建自定义属性。您想要将想要放入访问者的任何逻辑都应该放在其他地方。

现在你有数学支持该规则:)