Iphone 我的应用程序在iOS 5上出现了严重的性能问题,有人能帮我弄清楚这个来自仪器的速度测试日志吗?
我有一个简单的阅读应用程序,它使用fmdb与数据库对话,然后用文本填充UIWebview。自从ios 5的辉煌问世以来,它运行得非常糟糕 当我正在通过分段控制点击更改书中的章节时。在ios 4.3中,速度非常快。现在,正如您在下面看到的,它不是: 很明显,加载速度很慢,但我不知道如何读取速度测试的结果。哪种方法是罪魁祸首?我需要做什么来优化应用程序?我还能做些什么来了解这些障碍的确切位置吗 我在使用fmdb和ios 5时非常困难,因此我正在考虑其他选择。我应该放弃fmdb吗?选择直接ios sqlite db方法 我发现仪器工具很有用,但很难理解和使用 更新 以下是更改章节方法:Iphone 我的应用程序在iOS 5上出现了严重的性能问题,有人能帮我弄清楚这个来自仪器的速度测试日志吗?,iphone,performance,testing,ios5,instruments,Iphone,Performance,Testing,Ios5,Instruments,我有一个简单的阅读应用程序,它使用fmdb与数据库对话,然后用文本填充UIWebview。自从ios 5的辉煌问世以来,它运行得非常糟糕 当我正在通过分段控制点击更改书中的章节时。在ios 4.3中,速度非常快。现在,正如您在下面看到的,它不是: 很明显,加载速度很慢,但我不知道如何读取速度测试的结果。哪种方法是罪魁祸首?我需要做什么来优化应用程序?我还能做些什么来了解这些障碍的确切位置吗 我在使用fmdb和ios 5时非常困难,因此我正在考虑其他选择。我应该放弃fmdb吗?选择直接ios sq
- (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);
}
就sqlite而言,FMDB是我所知道的一切,它值得吗?我是否应该放弃它,转而使用cocoa touch sqlite api?好的,我实际上能够从FMDB邮件列表中的某个人那里获得此信息。他建议我在频繁调用的db表中添加一个索引,这就解决了这个问题 显然苹果改变了iOS 5中sqlite的版本 从FMDB帖子: 在sqlite中创建索引很容易——有关语法,请参见sqlite.org。 诀窍在于找出要创建的索引。 在我的例子中,我有一个类似的问题: 从x中选择a、b、c,其中sid=somevalue; sid不是表的主键,因此上没有索引 信息技术在sid上添加索引使查询速度大大加快,因为索引 允许它快速查找元组。请注意,索引可能会减慢速度 更新、插入和删除表,所以不要只是随机添加 表的索引。查看您的查询并查看列是什么
在查询的where子句中使用 看起来你40%的时间都在UIApplication sendEvent中。但这可能是因为您的changeChapter方法一次又一次地执行许多相同的操作,尽管无法准确地说出是什么操作-您实际执行的是PerformSelect还是编译器生成的?谢谢您的评论。看起来是由编译器生成的。在下一个章节方法过程中,我根本没有调用PerformSelect。您应该知道,虽然您已经删除了图像中的一些标识信息,但还没有删除所有信息。不管怎样,你最好使用实心条,你使用的线条不足以模糊文本。我直接使用sqlite也遇到了同样的问题,并且它在iOS 5中至少降低了一个数量级的性能。所以它不是FMDB。你能更精确一点吗?如何向常用表添加索引?再次感谢汉克斯:如果我错了,请纠正我,但这意味着您需要以某种方式管理您的查询,以便您知道要查找哪个索引,对吗?在我的例子中,我正在处理具有某种唯一整数标识符的数据——这也算作索引吗?