#SQLite et performances : ne récupérez de la base que ce dont vous avez besoin #UWP
Après mon précédent article sur SQLite, je me suis dit qu’il serait intéressant de partager quelques astuces simples à mettre en place pour améliorer les performances de vos applications lors de l’utilisation d’SQLite avec la librairie SQLite-net.
Prenons un exemple concret complètement hypothétique : j’ai une base de données stockant des informations sur des séries télévisées. Il existe beaucoup d’informations sur toutes les séries et j’ai besoin de toutes les stocker. J’ai donc une classe ShowInfo avec beaucoup de propriétés et une table correspondante avec une colonne par propriété.
Lorsque je suis sur ma page d’accueil, je veux afficher simplement une liste des entrées disponibles. Je peux donc lire simplement cette table via une requête classique :
DbConnectionAsync.Table<ShowInfo>().ToListAsync()
Sur un bon téléphone ou sur un PC, j’ai de bonnes performances (de l’ordre de 40ms) mais plus je descends en gamme (bonjour Lumia 520), plus les performances diminuent. Le problème ici c’est que je vais lire en base, convertir d’un type SQLite vers un type .Net puis monter en mémoire beaucoup d’informations dont je ne me sers pas.
Une des pistes d’améliorations est donc de lire uniquement ce dont j’ai besoin. La solution est donc de créer une classe dédiée pour l’écran concerné avec uniquement les propriétés nécessaires. Il faudra bien faire attention d’utiliser les mêmes noms et types que la classe “principale” contenant toutes les informations. Pour que cela fonctionne réellement, il faudra indiquer à SQLite-net le nom de la table ciblée car il utilise par défaut le nom de la classe. Cela est fait simplement en ajoutant un attribut Table sur la classe allégée.
Le code final est aussi simple que le premier :
// ma classe allégée [Table("ShowInfo")] public class ShowInfoLight { public string Id { get; set; } public string Status { get; set; } public string Title { get; set; } public string ImagePosterthumb { get; set; } } // ma méthode de lecture public Task<List<ShowInfoLight>> GetAllShowInfosFromCacheAsync() { return DbConnectionAsync.Table<ShowInfoLight>().ToListAsync(); }
Avec cette solution, j’arrive à avoir des performances de lecture 2 fois meilleures ce qui, en moyenne, sur un téléphone bas de gamme correspond à environ 150ms de mieux qu’avec le code initial. Cela parait peu mais il faut rappeler que nous parlons d’une 40aine d’éléments uniquement. Sur une liste plus conséquente, les gains de performances seront d’autant plus importants.
Bon code !
Commentaires