2011-05-10 160 views
0

我在CoreData中的表有8列,都是字符串。最大的字符串長度小於10K。iphone核心數據 - 爲什麼核心數據如此之慢?

首先,我用下面的代碼來檢索行:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Item" inManagedObjectContext:context]]; 
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"(URL ==[c] %@)", url]]; 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Time" ascending:NO selector:nil]; 
NSArray *descriptors = [NSArray arrayWithObjects:sortDescriptor, nil]; 
[fetchRequest setSortDescriptors:descriptors]; 
[sortDescriptor release]; 

NSError *error = nil; 
NSArray *array = [context executeFetchRequest:fetchRequest error:&error]; 

這裏是性能日誌:

2011-05-10 11:47:18.743的Test2 [2176:5907 CoreData:註釋:sql連接獲取時間:2.6172s

2011-05-10 11:47:21.600測試2 [2176:5907] CoreData:註釋:對於144行,總提取執行時間:2.8577s。

144行超過2秒?

然後我構建用於每一行的非coredata對象:

的性能日誌(我認爲對於一個行讀取)用於上述代碼
if ([array count] > 0) { 
    for (Item *item in array) { 
     SimpleItem *sitem = [[SimpleItem alloc] init]; 
     sitem.Title = item.Title; 
     sitem.Summary = item.Summary; 
     sitem.URL = item.URL; 
     [dataDict setObject:sitem forKey:item.URL]; 
     [sitem release]; 
    } 
    [dataDict release]; 
} 

部分是:

2011 -05-10 11:47:21.617 Test2 [2176:5907] CoreData:sql:SELECT 0,t0.Z_PK,t0.Z_OPT,t0.ZURL,t0.ZSUMMARY,t0.ZIMAGEURL,t0.ZTITLE,t0.ZURL ,t0.ZTIME FROM ZITEM t0 WHERE t0.Z_PK =?

2011-05-10 11:47:21.629的Test2 [2176:5907] CoreData:註釋:SQL連接提取時間:0.0098s

2011-05-10 11:47:21.633的Test2 [2176:5907 ] CoreData:註釋:總提取執行時間:1行0.0162s。

看起來有毛病。

任何人都可以幫助我提高性能?

另外,我在編輯xcode中的數據模型時檢查了URL的「Index」選項。這足以建立索引嗎?

+2

需要更多的細節提供任何有用的答案。 – 2011-05-10 10:52:18

+0

@Denis,是的,我更新了我的問題 – Jack 2011-05-10 11:45:13

回答

0

這聽起來像你沒有在你的列上使用任何索引,這可能有助於加快速度,但如果你正在搜索字符串10K的長度,CoreData可能不是要走的路。

而CoreData不是數據庫 - 它使用sqlite處理一些效率較低的問題。在CoreData中,對象被完全加載到內存中進行一些操作 - 將10K * 144記錄加載到內存中可能不會成爲世界上最快的事情:)

嘗試在sqlite中編寫數據庫代碼並查看它是否更快。

+0

你好。我認爲在我的情況下,CoreData沒有將144行內容一次加載到內存中。相反,只有當我讀取一行的每個屬性時,內容纔會被加載到內存中。我用完整的日誌更新我的問題。順便說一下,如何設置索引?謝謝 – Jack 2011-05-10 11:36:02

+0

如果您選擇一個屬性(本例中爲URL),則應在XCode的屬性檢查器視圖中標記爲「已編制索引」的複選框。 – deanWombourne 2011-05-10 11:48:30

+0

你也可以看看http://developer.apple。com/library/ios/#documentation/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html - NSFetchedResultsController將分批獲得結果,而不是一次獲得所有結果。 – deanWombourne 2011-05-10 11:49:25