0

我在 HTC Sensation 上体验了 android 2.3.4 和 4.0.3 之间的巨大性能差异。

一些附加信息:

  • ormlite 版本 4.42
  • 为了获得 dao,我使用 DaoManager 和一个 dao 单例。
  • 使用批处理任务插入
  • 我正在尝试创建或更新 30 个对象(仅创建需要相同的时间)
  • 这些是单个对象(没有关系),但具有长字符串字段。

时间日志:

ICS (4.0.3)

10-16 09:17:06.206: 1 getting dao
10-16 09:17:06.206: 2 got dao
10-16 09:17:06.206: 2 start call batch task
10-16 09:17:06.216: 3 start initializing batch_task
10-16 09:17:06.326: 121 finished initializing batchtask  
10-16 09:17:06.836: 623 end batch task

2.3.4

10-16 09:20:00.355: 0 getting dao
10-16 09:20:00.355: 1 got dao
10-16 09:20:00.355: 1 start call batch task
10-16 09:20:00.355: 1 start initializing batch_task
10-16 09:20:00.435: 87 finished initializing batchtask  
10-16 09:20:00.445: 96 end batch task 

正如您在 ICS 上看到的那样,需要花费更多时间。

我应该怎么做才能在 ICS 上获得类似的性能?

4

2 回答 2

3

所以在评论中反复讨论之后,事实证明,Android ICS 中的性能差异可能是由于默认情况下,在该版本中,SQLite 可能以“TRUNCATE”日志模式运行。从Sqlite 文档

TRUNCATE 日志模式通过将回滚日志截断为零长度而不是删除它来提交事务。在许多系统上,截断文件比删除文件要快得多,因为不需要更改包含目录。

相比之下,2.3.4 以Write-Ahead-Logging (WAL) 模式运行它。我猜 WAL 更快。

要更改ORMLite中的日志,您需要执行以下操作(我猜):

someDao.rawExecute("PRAGMA journal_mode = WAL;");

有关更多示例,请参阅Sqlite PRAGMA 文档

于 2012-10-16T16:39:03.993 回答
1

最后,我找到了解决方案:

getHelper().getDao();
SQLiteDatabase db = getHelper().getWritableDatabase();
Cursor cursor = db.rawQuery("PRAGMA journal_mode = WAL;", null);

只有这种方式有效。

此问题的其他附加信息:

  • 我有 2 个 HTC Sensation,都更新到 ICS,所以更新到 4.0.3
  • 但是软件编号不一样!!(3.33.401.53 和 3.33.401.6),并且设备上没有可用的更新(这很奇怪)。我真的不明白发生了什么,也许他们在构建之间更改了默认日记模式?

因此,如果您遇到缓慢的数据库功能,请检查 db 上的第一个日志模式。谢谢格雷,你的帮助。

于 2012-10-18T06:39:39.577 回答