iphone – 我的应用程序遭遇iOS 5的主要性能问题,有人可以帮助我从仪器中理解这个速度测试日志吗?

我有一个简单的阅读应用程序,它使用fmdb与数据库通信,然后用文本填充UIWebview.自从ios 5的辉煌问世以来,它的运行非常糟糕……

当我通过segmentedControl tap更改我书中的章节时.在ios 4.3中,它速度非常快.现在,正如您在下面看到的那样,它不是:

所以显然事情是加载缓慢,但我不知道如何阅读速度测试的结果.哪种方法是罪魁祸首?我需要做些什么才能优化应用?还有什么我可以做的,以了解挂起的确切位置?

我在fmdb和ios 5上遇到了这么难,我正在考虑其他选择.我应该废弃fmdb吗?并采用直接的ios sqlite db方法?

我发现仪器工具很有用,但很难理解和使用.

UPDATE

这是更改章节方法:

- (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一样,它甚至值得吗?我应该废弃它并转移到可可触摸sqlite api?

最佳答案 好的,我实际上能够从FMDB邮件列表上的某个人那里获得这些信息.他建议我为我经常调用的db表添加一个索引,然后修复它!

显然,Apple在iOS 5中更改了sqlite的版本.

来自FMDB帖子:

在sqlite中创建索引很简单 – 请参阅sqlite.org了解语法.
诀窍在于确定要创建的索引.
在我的情况下,我有一个查询,如:
从x中选择a,b,c,其中sid = somevalue;
sid不是表的主键,因此没有索引
它.在sid上添加索引使得查询自索引以来更快
允许它快速找到元组.请注意,索引可能会变慢
更新,插入和删除表,所以不要只是随机添加
索引到你的表.查看您的查询并查看列
用于查询的where子句.

点赞