我有一個超過280.000+的單詞列表,從SQLite數據庫加載到NSArray。然後我進行快速枚舉以檢查用戶輸入的某個字符串值是否與數組中的某個單詞相匹配。由於數組非常大,因此iphone 4需要大約1-2秒才能通過該陣列。提高快速枚舉性能
我該如何提高性能?也許我應該製作幾個更小的陣列?一個用於字母表中的每個字母,以便有更少的數據要通過。
這是我的數據庫類的外觀
static WordDatabase *_database;
+(WordDatabase *) database
{
if (_database == nil) {
_database = [[WordDatabase alloc] init];
}
return _database;
}
- (id) init
{
if ((self = [super init])) {
NSString *sqLiteDb = [[NSBundle mainBundle] pathForResource:@"dictionary" ofType:@"sqlite"];
if (sqlite3_open([sqLiteDb UTF8String], &_database) != SQLITE_OK) {
NSLog(@"Failed to open database!");
}
}
return self;
}
- (NSArray *)dictionaryWords {
NSMutableArray *retval = [[[NSMutableArray alloc] init] autorelease];
NSString *query = @"SELECT word FROM words";
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(_database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW) {
char *wordChars = (char *) sqlite3_column_text(statement, 0);
NSString *name = [[NSString alloc] initWithUTF8String:wordChars];
name = [name uppercaseString];
[retval addObject:name];
}
sqlite3_finalize(statement);
}
return retval;
}
然後在我的主要觀點我初始化它像這樣
dictionary = [[NSArray alloc] initWithArray:[WordDatabase database].dictionaryWords];
,最後我用這個方法
- (void) checkWord
{
NSString *userWord = formedWord.wordLabel.string;
NSLog(@"checking dictionary for %@", userWord);
for (NSString *word in dictionary) {
if ([userWord isEqualToString: word]) {
NSLog(@"match found");
}
}
}
經過陣列
所有鍵值對與NSSet中替換的NSArray,然後校驗碼變成[集containsObject:字]。確實是 – 2012-08-15 18:29:08
。將NSArray更改爲NSSet幾乎可以立即進行檢查。儘管字典的初始加載時間稍長一些。但這是一個小的折衷。 – 2012-08-15 19:09:58
雖然這仍然是很多內存。如果你的應用需要做其他的事情,你可能會發現SQL搜索已經足夠好了,特別是當你將數據庫編入索引時......你甚至可以將SQL數據庫作爲一個大表使用。用該單詞創建一個散列,然後向數據庫詢問與該散列匹配的所有單詞。在這個小列表上的線性搜索將不會是什麼,並且對索引整數值的SQL搜索非常快。然後你不必使用所有的內存。 – 2012-08-15 19:23:05