web-dev-qa-db-ja.com

Firebaseはデータをキャッシュしますか?

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

23
Pier

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

36