2014-01-09 35 views
3

我正試圖追捕我在覈心數據中看到的奇怪事情。我創建了一個示例項目來顯示此問題 - 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方法]

有沒有人其他人看到這個問題?我試過尋找自動生成的訪問器的功能,它看起來不像我的自定義訪問器。

我剛剛運氣不好,如果你自己實現訪問器,那麼它只會是很多較慢?

我還沒有提交過雷達,但我很快就會做。

+0

'willChangeValueForKey:'似乎是罪魁禍首。我做了一個類似的測試(使用OS X命令行工具),80%的'setCustom:'花費在'willChangeValueForKey:'中。 - 但我不知道爲什麼會發生這種情況,或者如何解決它。 (但核心數據編程指南明確提到自動訪問器已經優化。) –

+0

這是一個非常有趣的問題。等待Marcus Zarra或Martin R回答。 :-) –

+0

@MartinR確實。但是你必須按照蘋果公司的文檔來稱呼它。動態生成的不直接調用'willChangeValueForKey:'。它調用一個C函數,該函數被稱爲類似'_PF_xxx_WillChangeValueForKeyIndex'(尚未得到實際符號名稱)的'_sharedImpl_setVfk_core'副本,該副本是爲每個動態設置器創建的。奇怪的是,它*的速度要慢得多。我在應用程序中創建了大量對象,我看到自定義訪問器對導入數據集的整體時間產生巨大影響。 – mattjgalloway

回答

2

我不認爲提交雷達是有意義的。正如馬丁指出的那樣,生成的訪問者無疑會進行一些優化。

這跟隨蘋果最近一直強調的道路,不要創建自定義訪問器。由於訪問者只能訪問他們的屬性,因此沒有理由再創建自定義屬性。任何邏輯,你認爲你想放入訪問者應該去其他地方。

現在你有數學備份規則:)

+1

是的,我現在同意。特別是因爲我們現在知道這是由於在生成的訪問器中進行了明顯的優化。我現在改變了我的模式,不需要自定義存取器。感謝您閱讀並提供建議! – mattjgalloway

相關問題