2017-10-10 28 views
2

ちょうどFirestoreストレージと最初に行うべきことを模索し始めて - (グーグルで認証、おそらくそれは重要ではありません)ドキュメントキーで私の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つのプロパティのみで、1つ(int)はnullではないため、サイズは問題になりません。質問のAndroid 7.1に

、実際の電話でネクサス6アプリを実行している:私が間違っているのでしょうか?私は基本的にどのように-へのガイドの「"Getting dataからのサンプルを使用しています。

Aは0ミリ秒を取る必要があり、このように読む。回避策がない場合、私は私のようにリアルタイムストレージのアイデアを放棄しなければならないと思いますアプリのためだけのストレージおよびバックプレーンのSQLiteに取得し、別のクラウド・ストレージとしてFirebase/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

私はそうではありません。私はそこにネットワークが関わっているとは思っていませんでしたが、ローカルにキャッシュしたバージョンを返すと思っていました。それがリスナーを付けるときに得られるものなら、どうして違いがあるのでしょうか?それは非常に混乱しています。理想的には、サーバーから実際のデータを取得しようとするか、ローカルデータを高速にしたいかどうかを示すフラグを使用することをお勧めします。 – smok

答えて

3

これらget()の要求は、ネットワークを介して、クラウドFirestoreバックエンドからデータを読んでいるので、彼らは必ずしもただ、ディスクからローカルに読んでいるのSQLiteよりもはるかに遅くなります。最初の読み取りは、バックエンドへのネットワークチャネルを開始する必要があるため、後の読み取りよりも遅くなる可能性があります。時間の経過とともにパフォーマンスが向上すると見ていきますが、ネットワーク経由でデータを取得している場合は0msは期待できません。

は、あなたが以前に読んだデータのローカルキャッシュを有効でしょうenable offline persistenceにしたいことがあります。ただし、get()コールは、できるだけ最新のデータとしてネットワークに接続しようとします。 addSnapshotListener()を代わりに使用する場合は、ネットワークを待たずに、キャッシュされたデータをすぐにお電話でお送りします。

+0

素早く対応してくれてありがとうございます。オフライン永続性はすでに有効になっており、データベース設定を調べて確認しました。私もリスナーを追加しようとしたが、それは呼び出されますが、遅延は約500msでした。とにかくそれはあなたが永続化が有効になっていると、以前に取得したデータを読み取るために、スナップショットのリスナーを使用している場合は、遅延が500msのすべきではない、私は今、私は後でそれを必要とするまで、明示的にデータをキャッシュする必要があり、これは物事をたくさん – smok

+0

を複雑に完全に異なるモデルです。完全なサンプルコードを共有できると便利です。 –

+0

確かに、質問に追加 – smok

関連する問題