我正試圖追捕我在覈心數據中看到的奇怪事情。我創建了一個示例項目來顯示此問題 - 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"];
}
如果使用每個二傳手我的儀器,我發現自定義一個慢得多(〜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:
helper方法]
有沒有人其他人看到這個問題?我試過尋找自動生成的訪問器的功能,它看起來不像我的自定義訪問器。
我剛剛運氣不好,如果你自己實現訪問器,那麼它只會是很多較慢?
我還沒有提交過雷達,但我很快就會做。
'willChangeValueForKey:'似乎是罪魁禍首。我做了一個類似的測試(使用OS X命令行工具),80%的'setCustom:'花費在'willChangeValueForKey:'中。 - 但我不知道爲什麼會發生這種情況,或者如何解決它。 (但核心數據編程指南明確提到自動訪問器已經優化。) –
這是一個非常有趣的問題。等待Marcus Zarra或Martin R回答。 :-) –
@MartinR確實。但是你必須按照蘋果公司的文檔來稱呼它。動態生成的不直接調用'willChangeValueForKey:'。它調用一個C函數,該函數被稱爲類似'_PF_xxx_WillChangeValueForKeyIndex'(尚未得到實際符號名稱)的'_sharedImpl_setVfk_core'副本,該副本是爲每個動態設置器創建的。奇怪的是,它*的速度要慢得多。我在應用程序中創建了大量對象,我看到自定義訪問器對導入數據集的整體時間產生巨大影響。 – mattjgalloway