2010-12-13 37 views
14

Je suis curieux de savoir si quelqu'un a fait des tests de performance sur l'interrogation d'un ContentProvider via ContentResolver vs l'interrogation d'un objet SQLiteDatabase dans le même processus. Je suppose qu'une requête ContentResolver renvoie un Cursor qui communique avec la base de données via un classeur (IPC Android). Cela signifie que si je lis le contenu de 100 enregistrements à travers le Cursor qui entraînerait 100 appels de méthode Binder. Est-ce que mes suppositions sont exactes et, dans l'affirmative, cela serait-il beaucoup plus lent que d'accéder à la base de données dans le même processus?Android ContentProvider Performance

+0

En note, j'ai effectué un test sur un appareil Android 800MHz comparant un appel à des méthodes locales contre des appels à des méthodes distantes. L'appel d'une méthode distante avec un simple paramètre de chaîne de 26 caractères prend environ 400 nanosecondes de plus que l'appel d'une méthode locale. L'envoi d'un paramètre de chaîne de 10 000 caractères prend 2,3 millisecondes de plus. Il est clair que plus le nombre de données envoyées (ou reçues) sera long, plus elles seront longues. – satur9nine

+0

Quelque chose que j'ai appris: Les curseurs passés par ContentProviders contiennent un CursorWindow, le CursorWindow est une zone mise en cache du Cursor 2MB en taille, la plupart des requêtes rentreront dans le tampon entier. Ainsi, l'accès aux données à partir du curseur n'initialise généralement pas un appel de méthode Binder car toutes les données sont déjà présentes. Cependant, si vous tentez de lire des données en dehors de CursorWindow dans un grand curseur, la fenêtre devra se déplacer et le cache sera renvoyé. le classeur. – satur9nine

Répondre

3

Je n'ai pas fait exactement cela. Ce que j'ai fait était de mesurer la performance de plusieurs insertions via un ContentProvider ou directement via une base de données SQLite. J'ai inséré environ 1000 articles (un par un). Il était beaucoup plus lent à insérer via un ContentProvider. Dans mon test, presque 10% plus lent.

+3

Si vous allez insérer 1000 éléments un par un, vous utiliserez un ContentProviderOperation et exécuterez un batchInsert. L'insertion de 1000 éléments un à un sera incroyablement lente, peu importe ce que vous utiliserez, donc je ne m'étendrai pas trop sur ce cas-test. D'après mon expérience, la différence entre "utiliser un ContentProvider" et "ne pas utiliser ContentProvider" n'a jamais été à la vitesse/efficacité avec laquelle les opérations sont effectuées. –