2010-12-13 2 views
14

Мне интересно, если кто-либо выполнил любое тестирование производительности при запросе ContentProvider через ContentResolver против запроса объекта SQLiteDatabase в том же процессе. Я предполагаю, что запрос ContentResolver возвращает курсор, который связывается с базой данных через Binder (Android IPC). Это означает, что если я прочитаю содержимое 100 записей через Cursor, что приведет к вызову 100 вызовов Binder. Правильны ли мои догадки, и если это будет значительно медленнее, чем доступ к базе данных в том же процессе?Производительность Android ContentProvider

+0

В качестве побочного примечания я выполнил тест на устройстве Android на 800 МГц, сравнивая вызовы локальных методов с вызовами удаленных методов. Вызов удаленного метода с простым 26-символьным строковым параметром занимает примерно 400 наносекунд дольше, чем вызов локального метода. Отправка 10 000 символов String paramater занимает 2,3 миллисекунды дольше. Ясно, что чем больше данных будет отправлено (или получено), тем дольше это займет. – satur9nine

+0

Что-то, чему я научился: курсоры, переданные ContentProviders, содержат CursorWindow, CursorWindow - это кешированная область Cursor 2MB в размере, большинство запросов будут помещаться во весь буфер. Таким образом, доступ к данным из Курсора обычно не инициирует вызов метода Binder, так как все данные уже есть, однако, если вы попытаетесь прочитать данные вне CursorWindow в огромном курсоре, тогда окно нужно будет переместить, и кэш будет подвергнут повторению Связующее. – satur9nine

ответ

3

Я не сделал именно этот опрос. То, что я сделал, - это измерить производительность нескольких вложений через ContentProvider или напрямую через базу данных SQLite. Я вставил около 1000 предметов (один за другим). С помощью ContentProvider было гораздо медленнее вставлять их. В моем тесте почти на 10% медленнее.

+3

Если вы собираетесь вставлять по 1000 элементов один за другим, вы должны использовать 'ContentProviderOperation' и выполнять' batchInsert'. Вставка 1000 предметов по одному будет невероятно медленной, независимо от того, что вы используете, поэтому я бы не стал слишком заглядывать в этот тест. По моему опыту, разница между «использованием« ContentProvider »и« не использованием «ContentProvider» никогда не снижалась до скорости/эффективности, с которой выполняются операции. –

Смежные вопросы