我在某处读到Firebase缓存数据的声明。
所以我运行了this test,读取了大量的数据(大约400KB)。
以下是相关代码。
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);
}
正如您所看到的,第一次加载数据需要一段时间,而后续调用则需要更少的时间。
firebase回答:1279.422ms
firebase回答:236.378ms
firebase回答:228.595ms
firebase回答:202.700ms
firebase回答:208.371ms
firebase回答:214.807ms
等
但是,如果数据在本地缓存~200ms
(有时更多)似乎需要大量时间来访问本地数据。足以让用户在渲染UI时感知延迟。
Firebase缓存数据也是如此?那些~200ms
中发生了什么?
答案 0 :(得分:33)
只要存在该数据的活动侦听器,Firebase就会缓存数据(在内存中)。
由于您的代码仅使用once()
侦听器,因此在收到数据时(在调用回调之前)会立即分离侦听器,并从缓存中清除数据。这意味着必须从服务器获取每个once()
的数据,这显然是您的情况下的200ms往返。第一个加载速度较慢,因为可能在该调用中建立了连接。
验证这一点的一个快速技巧是在开始循环之前添加永久监听器:
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);
}
通过这种简单的更改,日志变为:
firebase回答:580.575ms
firebase回答:4.040ms
firebase回答:7.569ms
firebase回答:5.739ms