【发布时间】:2011-05-24 12:29:09
【问题描述】:
我很好奇是否有人对通过ContentResolver 查询ContentProvider 与在同一过程中查询SQLiteDatabase 对象进行了任何性能测试。我猜ContentResolver 查询会传回一个游标,该游标通过 Binder(Android IPC)与数据库通信。这意味着如果我通过 Cursor 读取 100 条记录的内容,将导致 100 次 Binder 方法调用。我的猜测是否正确,如果正确,那会比在同一进程中访问数据库要慢得多吗?
【问题讨论】:
-
附带说明一下,我在一个 800MHz 的 Android 设备上进行了测试,比较了对本地方法的调用和对远程方法的调用。使用简单的 26 字符字符串参数调用远程方法比调用本地方法花费大约 400 纳秒。发送一个 10,000 个字符的字符串参数需要多花 2.3 毫秒。显然,发送(或接收)的数据越多,所需的时间就越长。
-
我学到的东西:ContentProviders 传递的游标包含一个CursorWindow,CursorWindow 是Cursor 2MB 大小的缓存区域,大多数查询将适合整个缓冲区。因此,从 Cursor 访问数据通常不会启动 Binder 方法调用,因为所有数据都已经存在,但是如果您尝试在巨大的光标中读取 CursorWindow 之外的数据,则需要移动 Window 并且将重新发送缓存粘合剂。
标签: android performance sqlite ipc