Firebaseがデータをキャッシュするという主張をどこかで読みました。
そこで、私は このテスト を実行しました。これは、大量のデータ(約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
?
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