2010-12-13 126 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