2017-10-10 81 views
2

剛開始探索Firestore存儲並首先要做的事情 - 通過文檔密鑰(通過Google驗證,但可能不重要)在我的Android應用程序中讀取一個簡單的小文檔。這裏是一個片段:Firestore文檔get()性能

public void readDoc(final String key) { 
    final long start = System.currentTimeMillis(); 
    docsCollection.document(key).get().addOnCompleteListener(
     new OnCompleteListener<DocumentSnapshot>() { 
     @Override public void onComplete(@NonNull Task<DocumentSnapshot> task) { 
      long end = System.currentTimeMillis(); 
      Log.d("FirestoreStorage", "get() time: " + (end - start)); 
     } 
     }); 
} 

這是我在logcat中看到:

10-10 22:30:06.026 D/FirestoreStorage: get() time: 1666 
10-10 22:30:08.199 D/FirestoreStorage: get() time: 264 

第一次讀總是很慢,隨後的讀取200ms左右。該文檔非常小,目前只有4個屬性,只有一個(int)非空,所以大小不是問題。在Android 7.1上運行應用程序Nexus 6

問題:我在做什麼錯?我基本上使用從"Getting data「的如何引導樣本。

一個念想這應該採取0毫秒。如果沒有解決方法,我想我不得不放棄實時存儲的想法該應用的唯一存儲和找回普通SQLite和使用火力地堡/公司的FireStore作爲一個單獨的雲存儲。

PS公司的FireStore存儲初始化和相應的日誌,很抱歉不能爲500ms,但350,它的不同,有時400,有時300:

public FirestoreStorage(String userRef) { 
    Log.i(TAG, "User ref: \"" + userRef + "\""); 
    db = FirebaseFirestore.getInstance(); 
    Log.i(TAG, "Is persistence enabled: " + db.getFirestoreSettings().isPersistenceEnabled()); 
    DocumentReference userDoc = db.collection("users").document(userRef); 
    prefsCollection = userDoc.collection("prefs"); 
    prefsCollection.addSnapshotListener(
     Executors.newFixedThreadPool(2), 
     new EventListener<QuerySnapshot>() { 
      @Override 
      public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) { 
      Log.d(TAG, "Prefs.onEvent"); 
     } 
    }); 
    Log.i(TAG, "Snapshot listener added"); 

    try { 
     Thread.sleep(2000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    } 

日誌:

10-11 23:11:42.382 I/FirestoreStorage: User ref: "<cut>" 
10-11 23:11:42.474 I/FirestoreStorage: Is persistence enabled: true 
10-11 23:11:42.496 I/FirestoreStorage: Snapshot listener added 
10-11 23:11:42.855 D/FirestoreStorage: Prefs.onEvent 
+0

您如何期望網絡調用在0毫秒內返回數據? –

+0

我沒有:)我沒有想到網絡會被捲入那裏,我認爲它只會返回它在本地緩存的版本。如果這就是我附加一個監聽器時得到的結果,爲什麼get()會有所不同?這很混亂。理想情況下,我更喜歡一個標誌來說明我是否想嘗試從服務器獲取實際數據,或者我只想快速獲得本地數據 – smok

回答

3

這些get()請求讀取來自雲公司的FireStore後端數據,在網絡上,所以他們會一定比SQLite的這是剛剛從本地磁盤讀取慢得多。第一次讀取也可能比後續讀取慢,因爲它必須啓動到後端的網絡通道。我們將着眼於提高性能,但如果您通過網絡檢索數據,則不能期望0 ms。

您可能想要enable offline persistence這將啓用您先前讀取的數據的本地緩存。請注意,儘管get()調用仍然會嘗試首先訪問網絡,以便爲您提供儘可能最新的數據。如果您使用addSnapshotListener()代替,我們會立即與緩存的數據通話,而無需等待網絡。

+0

感謝您的快速響應,Michael。脫機持久性已啓用,我通過獲取數據庫設置進行檢查。我也嘗試添加監聽器,它確實被調用,但延遲大約爲500ms。無論如何,這是一個完全不同的模型,我現在必須明確地緩存這些數據,直到我稍後需要它,這使事情變得複雜 – smok

+0

如果啓用了持久性並且正在使用快照偵聽器來讀取以前獲取的數據,則延遲不應該是500ms 。如果你能分享完整的示例代碼,這將會很有幫助。 –

+0

當然,增加了問題 – smok

相關問題