Realm, la solution pour la persistance des données de vos applications mobiles iOS/Android ?
Une base de données destinée aux mobiles, tablettes et wearables
Realm est la première base de données destinée uniquement aux plates-formes mobiles qui ne repose sur aucune autre, contrairement aux nombreuses librairies qui proposent des solutions mobiles basées sur SQLite. On peut citer par exemple le framework mis à disposition par Apple pour les applications iOS : Core Data, ou bien ORMLite qui propose de faire le pont entre des objets Java et une base de données relationnelle.
Realm est un projet jeune, en développement depuis 2011, qui s’est focalisé avant tout vers iOS et qui depuis le 29 septembre 2014 propose ses fonctionnalités au système Android.
Pourquoi Realm ?
Le problème majeur ici est qu’aucune d’entre elle ne peut être intégrée dans un projet mobile/tablette ou wearable du fait qu’elles n’ont pas été conçues pour ça.
À l’heure actuelle, pour les développeurs mobile, la solution la plus performante pour la persistance des données est d’avoir recours à SQLite. Ainsi l’introduction en 2000 de SQLite a été une étape révolutionnaire dans le domaine du développement mobile, mais 14 années plus tard cette activité n’a plus rien à voir. En effet, il suffit de se représenter l’image d’un téléphone ou même d’une “application” au début des années 2000 pour comprendre que la conception et le développement d’applications mobiles ont bien changé.
C’est à ce moment que Realm intervient en mettant à disposition des développeurs un système de persistance de données multi plates-formes (iOS/Android) performant et simple à mettre en oeuvre.
Performant : comment ?
Comme énoncé précédemment, le coeur de la technologie développée pour Realm ne s’appuie pas sur une base de données existante et n’est pour l’instant pas open source. Ce que l’on sait à propos du coeur de Realm c’est qu’il repose sur un noyau codé en C++ et créé dans le but de s’exécuter sur des plates-formes mobiles. En prenant donc en compte les contraintes imposées par ce type de terminaux, notamment l’espace mémoire et la relative lenteur des processeurs embarqués.
Pour gagner en performance, Realm s’appuie sur les concepts de :
- Data Structure Alignment : réduit de 90% au maximum l’empreinte mémoire.
- Cache & Vectorization : Permettent un accès au données plus rapide
- Zero copy architecture
De plus, les fichiers .realm dans lesquels sont stockées les données sont compatibles quels que soient la plate-forme et le langage utilisés (iOS: Objective-C et Swift ou Android: Java).
Pour illustrer ces promesses de performances Realm met à disposition le code utilisé pour effectuer leurs études comparatives ici.
Benchmark
Dans un premier temps intéressons-nous à l’objectif principal d’une base de données, la persistance, et plus particulièrement les insertions.
Pour ce benchmark, la base de données créée contient une table Employee, avec pour attributs un nom, un âge et un booléen hired = true si l’employé est embauché.
La figure ci-dessous provient de l’application standalone Realm browser disponible avec Realm qui permet de consulter et éditer le contenu de la base de données sur laquelle on travaille, un outil très pratique pour le développeur.
La requête d’insertion a inséré 200 000 fois un employé avec un nom allant de “Foo0” à “Foo999” avec une tranche d’âge de 20 à 69 et une valeur de hired true pour les lignes impaires et false pour les lignes paires.
Ce diagramme indique que Realm, malgré sa jeunesse, promet déjà plus de performance en insertion massive en une seule transaction que les frameworks actuels utilisés par des millions d’applications. On pense notamment à celui mis en avant par Apple: Core Data qui permet d’insérer 5 fois moins d’enregistrements par seconde en une seule transaction.
Cependant il n’est pas plus performant sur ce terrain que la version “compiled statement” de SQLite, qui double le nombre d’insertions effectuées par seconde en une transaction.
Dans un second temps voyons comment ces bases de données réagissent face aux requêtes qu’on leur soumet.
La requête sur la table Employee est la suivante :
Sélectionner toutes les entrées de la table Employee dont la valeur de hired est fausse et dont l’âge est compris entre 20 et 50 et dont le nom est “Foo0”
En SQL cela donne :