【发布时间】:2015-04-01 22:46:38
【问题描述】:
我有一个查询在 Gingerbread 设备和 Jellybean 上运行得非常好,但在 Lollipop 设备上运行速度要慢很多。我确定查询是正确的并且写得很好,因为它在旧设备上运行良好。
Cursor c;
String query = QUERY STRING;
c = db.rawQuery(query,new String[]{Integer.toString(a),Integer.toString(b)});
Log.e("SQL_QUERY_PROGRESS","1");
while(c.moveToNext()){
Log.e("SQL_QUERY_PROGRESS","2");
// Do stuff with data
}
c.close();
在 Gingerbread 设备上,两条日志消息之间只有 0.008 秒的间隔,而在 Lollipop 设备上则需要约 8 秒,这非常慢。
我无法理解的是,Lollipop 设备较新,并且具有更多 RAM、CPU 能力等,因此逻辑上肯定较新设备应该比旧设备更快地运行查询。
Lollipop 上使用的 Java 版本是否存在错误,或者 SQLite 版本是否会导致速度大幅下降?
我用过adb shell
并导航到数据库文件并在 Lollipop 设备上使用 sqlite3 运行查询,它几乎立即运行,这让我认为这更像是 Java 问题而不是 SQLite 问题。
我完全不知道可能导致延迟的原因,因此非常感谢任何帮助或想法,以便我可以进一步调查!
【问题讨论】:
-
Lollipop 设备通常对
userdata分区进行加密 - 这会减慢许多与存储相关的操作,包括数据库访问。除此之外,更新的设备并不总是转化为更快的存储。有很多因素在起作用。因此,除非您想在不同 android 版本下的同一设备上的同一数据集上运行查询并提供更多信息 - 您的问题没有实际意义且离题 -
您是在主线程中运行查询还是在单独的线程中运行(AsyncTask、Thread、IntentService...)?
-
@Sunil 我让它在主线程中运行。在 Gingerbread 和 Jellybean 设备上的主线程中很好,因为它几乎立即执行,但不适用于 Lollipop
-
@PriestVallon - 我没有投反对票(我很少投反对票)......但回到你的问题,只有这个特定的查询才会这样做吗?因为在大约 8 秒时,我确信应用程序应该触发可怕的应用程序无响应 (ANR)。我建议您使用 TraceView 找出发生了什么并在另一台设备上试用该应用程序。还有你要返回多少行?
-
你没有抓住重点。我可以轻松地将查询移动到不同的线程,但我仍然需要在 Lollipop 设备上等待约 8 秒,这并不令人满意。
标签: android performance sqlite android-5.0-lollipop