2010-12-13 28 views
14

Jestem ciekawy, czy ktoś wykonał jakiekolwiek testy wydajności na zapytanie o ContentProvider przez ContentResolver vs zapytanie o obiekt SQLiteDatabase w tym samym procesie. Zgaduję, że zapytanie ContentResolver przesyła kursor, który komunikuje się z bazą danych za pośrednictwem modułu wiążącego (Android IPC). Oznacza to, że jeśli odczytam zawartość 100 rekordów za pomocą Cursor, które spowodowałyby 100 wywołań metody Binder. Czy moje domysły są poprawne, a jeśli tak, to byłoby znacznie wolniej niż dostęp do bazy danych w tym samym procesie?Android ContentProvider Performance

+0

Na marginesie, wykonałem test na urządzeniu z Androidem 800 MHz porównując połączenia z metodami lokalnymi z połączeniami do metod zdalnych. Wywołanie metody zdalnej za pomocą prostego 26-znakowego parametru String zajmuje około 400 nanosekund dłużej niż wywołanie metody lokalnej. Wysyłanie 10 000 znaków Parametry ciągu trwają o 2,3 milisekundy dłużej. Oczywiście im więcej danych jest wysyłanych (lub otrzymywanych), tym więcej czasu zajmie. – satur9nine

+0

Coś, czego się nauczyłem: Kursory przekazywane przez dostawców treści zawierają CursorWindow, CursorWindow jest buforowanym obszarem o rozmiarze Cursor 2MB, większość zapytań zmieści się w całym buforze. W ten sposób dostęp do danych z kursora zwykle nie inicjuje wywołania metody Binder, ponieważ wszystkie dane już istnieją, jednak jeśli spróbujesz odczytać dane poza kursorem CursorWindow przy dużym kursorze, wówczas okno będzie musiało się przenieść, a pamięć podręczna zostanie ponownie wysłana Spoiwo. – satur9nine

Odpowiedz

3

Nie zrobiłem dokładnie tego meassure. To, co zrobiłem, to sprawdzenie wydajności wielu wstawek za pośrednictwem ContentProvider lub bezpośrednio przez bazę danych SQLite. Wprowadziłem około 1000 pozycji (jeden po drugim). Wprowadzanie przez ContentProvider było znacznie wolniejsze. W moim teście prawie 10% wolniej.

+3

Jeśli zamierzasz wstawiać pojedynczo 1000 elementów, użyjesz 'ContentProviderOperation' i wykonasz polecenie' batchInsert'. Wstawianie 1000 przedmiotów jeden po drugim będzie niesamowicie wolne, bez względu na to, czego użyjesz, więc nie za bardzo zajrzę do tego testu porównawczego. Z mojego doświadczenia wynika, że ​​różnica między używaniem "ContentProvider" i "nieużywaniem" ContentProvider "nigdy nie sprowadza się do szybkości/wydajności, z jaką przeprowadzane są operacje. –