4.0.3(ICS)上的Ormlite性能

时间:2012-10-16 07:24:04

标签: android performance android-4.0-ice-cream-sandwich ormlite

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

其他一些信息:

  • ormlite版本4.42
  • 获得dao我使用DaoManager和dao单例。
  • 使用批处理任务插入
  • 我正在尝试createorupdate 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上获得类似的表现?

2 个答案:

答案 0 :(得分:3)

因此,在评论中经过一些来回之后,事实证明Android ICS中的性能差异可能是由于默认情况下,在该版本中,SQLite可能正在“TRUNCATE”日志模式下运行。来自Sqlite docs

  

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

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

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

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

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

答案 1 :(得分: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上的第一个日志模式。谢谢Gray,感谢您的帮助。