2012-10-16 19 views
0

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

一些额外的信息:

  • ormlite版本4.42
  • ,这是让我道使用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上获得类似的性能?

+0

这里没有问题吗? – TZHX

+0

因此,createOrUpdate速度较慢,但​​创建速度相同? – Gray

+0

这是在设备上还是在模拟器上运行? – Gray

回答

3

因此,在评论中来回之后,事实表明,Android ICS的性能差异可能是由于默认情况下,在该版本中,SQLite可能以“TRUNCATE”日记模式运行。从Sqlite docs

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

2.3.4比较运行在Write-Ahead-Logging(WAL)模式。我想WAL会更快。

要更改日志中ORMLite,你会做(我猜)类似如下:

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

更多的例子见Sqlite PRAGMA docs

1

最后,我找到了解决办法:

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

只有这样的工作。

其他附加信息这个问题:

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

因此,如果您有慢速数据库功能,请检查db上的第一个日志模式。谢谢格雷,为您提供帮助。

+4

是否有一个原因,我的答案没有回答你的问题?无论哪种方式,你都应该接受其中之一。 – Gray