2016-07-17 7 views
15

मैंने कहीं दावा किया है कि फायरबेस डेटा को कैश करता है।क्या फ़ायरबेस डेटा को कैश करता है?

तो मैं this test चला गया जो डेटा की अर्द्ध बड़ी मात्रा (लगभग 400 केबी) पढ़ता है।

यहां प्रासंगिक कोड है।

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

फायरबेस ने उत्तर दिया: 214.807ms

आदि

लेकिन, फिर भी, डेटा स्थानीय रूप से कैश है, तो ~200ms (कभी कभी अधिक) स्थानीय डेटा का उपयोग करने में बहुत समय लगता है। UI को प्रस्तुत करते समय उपयोगकर्ता को देरी को समझने के लिए पर्याप्त है।

तो फ़ायरबेस डेटा को कैश कर रहा है? ~200ms में क्या हो रहा है?

+0

ठीक है। चलो टिप्पणियों को साफ करते हैं। –

+0

अच्छा सवाल। और बेवकूफ ने यह पता लगाने के लिए अविश्वसनीय रूप से आसान बना दिया कि क्या हो रहा है। नीचे जवाब दें। –

उत्तर

19

फ़ायरबेस उस डेटा के लिए एक सक्रिय श्रोता होने तक डेटा (स्मृति में) को कैश करता है।

चूंकि आपका कोड केवल once() श्रोता का उपयोग करता है, इसलिए डेटा प्राप्त होने पर श्रोता तुरंत अलग हो जाता है (आपके कॉलबैक को लागू करने से पहले) और डेटा कैश से साफ़ हो जाता है। इसका मतलब है कि प्रत्येक once() के लिए सर्वर से डेटा प्राप्त करना है, जो स्पष्ट रूप से आपके मामले में 200 एमएमएस राउंड-ट्रिप है। पहला भार धीमा है, क्योंकि कनेक्शन उस कॉल में स्थापित होने की संभावना है।

इस सत्यापित करने के लिए एक त्वरित चाल अपने पाश शुरू करने से पहले एक स्थायी श्रोता जोड़ने के लिए है: कि साधारण परिवर्तन के साथ

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

+0

जानना अच्छा है। यह अच्छा होगा अगर डेटा थोड़ी देर के लिए कैश किया गया हो क्योंकि कभी-कभी उसी डेटा को कुछ सेकेंड बाद की आवश्यकता होगी। मैं एक सुविधा अनुरोध कहां कर सकता हूं? – Pier

+0

इसके अलावा, क्या आपको लगता है कि कैश सक्रिय रखने के लिए एक खाली फ़ंक्शन का उपयोग करना एक व्यवहार्य रणनीति है? – Pier

+0

एक खाली श्रोता को रखना मूल मोबाइल एसडीके में 'सिंक (सत्य)' रखता है। –

संबंधित मुद्दे