J'ai lu quelque part une affirmation selon laquelle Firebase met en cache les données.
J'ai donc exécuté ce test qui lit un volume de données semi-important (environ 400 Ko).
Voici le code pertinent.
firebase.initializeApp(config);
var counter = 0;
console.time('firebase answered in');
firebase.database().ref('texts').once('value',onData);
function onData(snapshot){
console.timeEnd('firebase answered in');
counter ++;
if(counter > 20) return;
setTimeout(function(){
console.time('firebase answered in');
firebase.database().ref('texts').once('value',onData);
},2000);
}
Comme vous pouvez le voir, la première fois qu'il charge des données, cela prend un certain temps et les appels suivants prennent beaucoup moins de temps.
firebase a répondu en: 1279.422ms
firebase a répondu en: 236.378ms
firebase a répondu en: 228.595ms
firebase a répondu en: 202.700ms
firebase a répondu en: 208.371ms
firebase a répondu en: 214.807ms
etc
Mais, quand même, si les données sont mises en cache localement ~200ms
(parfois plus) semble beaucoup de temps pour accéder aux données locales. Assez pour que l'utilisateur perçoive un retard lors du rendu de l'interface utilisateur.
Firebase met-il donc en cache les données? Que se passe-t-il dans ces ~200ms
?
Firebase met en cache les données (en mémoire) tant qu'il existe un écouteur actif pour ces données.
Étant donné que votre code utilise uniquement l'écouteur once()
, l'écouteur est détaché immédiatement lors de la réception des données (avant l'appel de votre rappel) et les données sont effacées du cache. Cela signifie qu'il faut récupérer les données des serveurs pour chaque once()
, ce qui est apparemment un aller-retour de 200 ms dans votre cas. La première charge est plus lente, car la connexion est probablement établie lors de cet appel.
Une astuce rapide pour vérifier cela consiste à ajouter un écouteur permanent avant de démarrer votre boucle:
firebase.initializeApp(config);
var counter = 0;
console.time('firebase answered in');
firebase.database().ref('texts').on('value',function() {});
firebase.database().ref('texts').once('value',onData);
function onData(snapshot){
console.timeEnd('firebase answered in');
counter ++;
if(counter > 20) return;
setTimeout(function(){
console.time('firebase answered in');
firebase.database().ref('texts').once('value',onData);
},2000);
}
Avec ce simple changement, la journalisation se transforme en:
firebase a répondu en: 580.575ms
firebase a répondu en: 4.040ms
base de feu répondu en: 7.569ms
firebase a répondu en: 5.739ms