Мое приложение страдает от серьезных проблем с производительностью iOS 5, может кто-нибудь помочь мне разобраться в этом журнале скоростных тестов с инструментов? - PullRequest
4 голосов
/ 13 декабря 2011

У меня есть простое приложение для чтения, которое использует fmdb для общения с базой данных, а затем заполняет UIWebview текстом.После славного появления ios 5 он работает очень плохо ...

Когда я изменяю главы в моей книге через сегментированный контроль.В ios 4.3 это было супер быстро.Теперь, как вы можете видеть ниже, это не так:

enter image description here

Итак, очевидно, что загрузка идет медленно, но я не знаю, как прочитать результаты теста скорости,Какой метод является основным виновником?Что мне нужно сделать, чтобы оптимизировать приложение?Есть ли что-нибудь еще, что я могу сделать, чтобы понять, где именно зависания?

У меня такое сложное время с fmdb и ios 5, что я рассматриваю другие варианты.Должен ли я просто отказаться от fmdb?И пойти на прямой подход ios sqlite db?

Я считаю инструмент инструментов полезным, но очень трудным для понимания и использования.

ОБНОВЛЕНИЕ

Вотизменить метод главы:

- (IBAction) changeChapter:(id)sender {
if ([prevNext selectedSegmentIndex] == 0) {
    //previous
    [self setCurrentChapter:(currentChapter-1)];
} else {
    //next
    [self setCurrentChapter:(currentChapter+1)];
}
[self refreshUI];
}

ОБНОВЛЕНИЕ 2:

Вот код, который, как говорят мне инструменты, является проблемой.Это следующий метод, который fmdb использует для перебора FMResultSet:

- (BOOL) next {

int rc;
BOOL retry;
int numberOfRetries = 0;
do {
    retry = NO;

    rc = sqlite3_step(statement.statement); //Instruments says this is 100% the problem

    if (SQLITE_BUSY == rc) {
        // this will happen if the db is locked, like if we are doing an update or insert.
        // in that case, retry the step... and maybe wait just 10 milliseconds.
        retry = YES;
        usleep(20);

        if ([parentDB busyRetryTimeout] && (numberOfRetries++ > [parentDB busyRetryTimeout])) {

            NSLog(@"%s:%d Database busy (%@)", __FUNCTION__, __LINE__, [parentDB databasePath]);
            NSLog(@"Database busy");
            break;
        }
    }
    else if (SQLITE_DONE == rc || SQLITE_ROW == rc) {
        // all is well, let's return.
    }
    else if (SQLITE_ERROR == rc) {
        NSLog(@"Error calling sqlite3_step (%d: %s) rs", rc, sqlite3_errmsg([parentDB sqliteHandle]));
        break;
    } 
    else if (SQLITE_MISUSE == rc) {
        // uh oh.
        NSLog(@"Error calling sqlite3_step (%d: %s) rs", rc, sqlite3_errmsg([parentDB sqliteHandle]));
        break;
    }
    else {
        // wtf?
        NSLog(@"Unknown error calling sqlite3_step (%d: %s) rs", rc, sqlite3_errmsg([parentDB sqliteHandle]));
        break;
    }

} while (retry);


if (rc != SQLITE_ROW) {
    [self close];
}

return (rc == SQLITE_ROW);
}

FMDB - это все, что я когда-либо знал в отношении sqlite, стоит ли оно того?Должен ли я просто отказаться от этого и перейти на apl's sqlite с какао-прикосновением?

1 Ответ

2 голосов
/ 16 декабря 2011

Хорошо, я действительно смог получить эту информацию от кого-то из списка рассылки FMDB.Он предложил мне добавить индекс к моим таблицам БД, которые часто вызывались, и это исправило это!

Очевидно, Apple изменила версию sqlite в iOS 5.

Из поста FMDB:

Создать индекс в sqlite очень просто - синтаксис см. В sqlite.org.Хитрость в том, чтобы выяснить, какой индекс (ы) создать.В моем случае у меня был такой запрос: выберите a, b, c из x, где sid = somevalue;sid не был первичным ключом для таблицы, поэтому там не было индекса.Добавление индекса в sid значительно ускорило этот запрос, поскольку индекс позволяет быстро находить кортежи.Обратите внимание, что индексы могут замедлять обновления, вставки и удаления в таблицу, поэтому не просто случайным образом добавляйте индексы в свои таблицы.Посмотрите на ваши запросы и посмотрите, какие столбцы используются в предложении where ваших запросов.

...