2010-12-13 130 views
14

我很好奇,如果有人在查询ContentProvider通过ContentResolver与在同一过程中查询SQLiteDatabase对象进行任何性能测试。我猜测ContentResolver查询返回一个Cursor,它通过一个Binder(Android IPC)与数据库进行通信。这意味着如果我通过Cursor读取了100条记录的内容,那将导致100个Binder方法调用。我的猜测是否正确,如果是这样,那会比在同一过程中访问数据库慢得多?Android ContentProvider性能

+0

作为一个方面说明,我在800MHz的android设备上进行了测试,比较了调用本地方法和远程方法的调用。使用简单的26个字符调用远程方法字符串参数比调用本地方法花费的时间大约400纳秒。发送10,000个字符的字符串参数需要2.3毫秒的时间。很明显,发送(或接收)的数据越多,需要的时间越长。 – satur9nine 2011-07-11 19:14:45

+0

我学到的东西:ContentProviders传递的游标包含CursorWindow,CursorWindow是游标大小为2MB的缓存区域,大多数查询都适合整个缓冲区。因此,从Cursor访问数据通常不会启动Binder方法调用,因为所有数据都已经存在,但是如果您试图在巨大的光标中读取CursorWindow之外的数据,那么Window将需要移动并且缓存将重新发送粘合剂。 – satur9nine 2014-06-04 23:07:59

回答

3

我还没有完成那个测量。我所做的是通过ContentProvider或直接通过SQLite数据库来确定多个插入的性能。 我插入了大约1000个项目(一个接一个)。通过ContentProvider插入要慢得多。在我的测试中,速度慢了近10%。

+3

如果您打算逐个插入1000个项目,那么您将使用“ContentProviderOperation”并执行一个'batchInsert'。无论您使用什么内容,逐个插入1000个项目都会非常慢,所以我不会太多地考虑这个基准。根据我的经验,“使用”ContentProvider“”和“不使用”ContentProvider“”之间的区别决不会落在执行操作的速度/效率上。 – 2012-10-15 17:23:28