Android ContentProvider 性能

Posted

技术标签:

【中文标题】Android ContentProvider 性能【英文标题】:Android ContentProvider Performance 【发布时间】: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 并且将重新发送缓存粘合剂。 【参考方案1】:

我还没有完全做到这一点。我所做的是通过 ContentProvider 或直接通过 SQLite 数据库测量多个插入的性能。 我插入了大约 1000 个项目(一个接一个)。通过 ContentProvider 插入要慢得多。在我的测试中慢了将近 10%。

【讨论】:

如果您要一个接一个地插入 1000 个项目,那么您将使用 ContentProviderOperation 并执行 batchInsert。无论您使用什么,一个接一个地插入 1000 个项目都会非常慢,所以我不会过多地研究这个基准。根据我的经验,“使用ContentProvider”和“不使用ContentProvider”之间的区别从未归结为执行操作的速度/效率。 取决于用例。如果我需要在 100 毫秒内获得一些特定信息(例如 UI 主题),ContentProvider 就不行了。【参考方案2】:

没有明确的答案,结果取决于你做什么以及如何做。

例如,我想在应用程序之间共享偏好,因此 ContentProvider 似乎是完美的答案。是的,如果我不介意第一次阅读的延迟时间更长,因为这些天在 S10+ 上连接到 ContentProvider 需要 120 毫秒!

因此,如果您的 UI 取决于这些设置,则最好在应用程序之间复制首选项文件(使用 ContentProvider),然后直接从文件中读取,否则 UI 将在显示适当的主题之前被延迟。事实上,新创建的活动已经调用了 onStart()。

另一方面,执行数据库操作(如果操作正确)不会改变太多结果,除非您需要频繁重新连接,因为这会增加不可忽略的开销。

【讨论】:

以上是关于Android ContentProvider 性能的主要内容,如果未能解决你的问题,请参考以下文章

Android中的ContentProvider源码解析

android-ContentProvider

Android开发实践 ContentProvider和ContentResolver

Android ContentProvider数据共享

Android ContentProvider完整案例

Android ContentProvider 使用