2010-12-13 28 views
14

ContentProviderからContentResolver経由でクエリを実行しても、同じプロセスでSQLiteDatabaseオブジェクトをクエリすると、パフォーマンステストを行ったことがある人は不思議です。私は、ContentResolverクエリがBinder(Android IPC)を介してデータベースと通信するCursorを返すと推測しています。これは、私がCursorによって100個のレコードの内容を読み込むと、100個のバインダーメソッド呼び出しが行われることを意味します。私の推測は正しいのでしょうか?そうであれば、同じプロセスでデータベースにアクセスするよりもかなり遅くなりますか?Android ContentProviderのパフォーマンス

+0

私は800MHzアンドロイドデバイスでローカルメソッドの呼び出しをリモートメソッドの呼び出しと比較してテストを行いました。単純な26文字のStringパラメータでリモートメソッドを呼び出すには、ローカルメソッドを呼び出すよりも約400ナノ秒かかるだけです。 10,000文字の文字列パラメータを送信するのに2.3ミリ秒かかる。明らかに、より多くのデータが送信される(または受信される)のにかかる時間は長くなります。 – satur9nine

+0

私が習得したこと:ContentProvidersが渡すカーソルにはCursorWindowが含まれ、CursorWindowはCursor 2MBのキャッシュ領域であり、ほとんどのクエリはバッファ全体に収まるでしょう。したがって、カーソルからのデータへのアクセスは通常、すべてのデータが既に存在するためバインダメソッド呼び出しを開始しませんが、巨大なカーソル内のCursorWindow外のデータを読み込もうとすると、ウィンドウが移動し、キャッシュが再送されますバインダー – satur9nine

答えて

3

私はまさにそのメスをしていません。私がやったのは、ContentProvider経由で、あるいはSQLiteデータベース経由で、複数のインサートのパフォーマンスを保証することでした。 約1000個のアイテムを挿入しました(1つずつ)。 ContentProvider経由で挿入する方がずっと遅かったです。私のテストでは、ほぼ10%遅くなりました。

+3

1000個のアイテムを1つずつ挿入する場合、 'ContentProviderOperation'を使用して' batchInsert'を実行します。 1000個のアイテムを1つずつ挿入することは、使用するものにかかわらず、非常に遅くなるので、このベンチマークをあまりにも多くは検討しません。私の経験上、「ContentProvider」と「ContentProvider」を使用しないことの違いは、操作が実行される速度/効率に決して下がっていません。 –

関連する問題