首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Firestore ()性能

Firestore ()性能
EN

Stack Overflow用户
提问于 2017-10-10 20:49:27
回答 1查看 3.7K关注 0票数 5

刚刚开始探索Fi还原存储和第一件事--通过文档密钥在我的Android应用程序中读取一个简单的小文档(通过Google认证,但这可能并不重要)。下面是一个片段:

代码语言:javascript
运行
复制
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中看到的内容:

代码语言:javascript
运行
复制
10-10 22:30:06.026 D/FirestoreStorage: get() time: 1666
10-10 22:30:08.199 D/FirestoreStorage: get() time: 264

第一次读取总是非常慢,后续读取大约是200毫秒。文档非常小,目前它只有4个属性,只有一个(int)是非空的,因此大小不是问题。在真正的手机上运行这个应用程序,在Android7.1上运行Nexus 6

问:我做错什么了?我基本上是在使用“如何指南”的“获取数据中的一个示例。

这样的读取应该花费0毫秒。如果没有解决办法,我想我必须放弃将实时存储作为应用程序的唯一存储空间的想法,回到普通的SQLite,使用Firebase/Firestore作为单独的云存储。

从版本16.0.0开始的UPDATE ( DocumentReference.get()Query.get() )有一个新的参数“DocumentReference.get()”,它允许控制数据是从哪里读取的-只有服务器,只有缓存或尝试服务器然后缓存。

PS修复存储初始化和相应的日志,抱歉不是500‘s,而是350,这是不同的,有时400,有时300:

代码语言:javascript
运行
复制
  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();
    }
  }

日志:

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-11 00:47:15

这些get()请求通过网络从Cloud后端读取数据,因此它们必然比SQLite慢得多,SQLite只是从磁盘本地读取数据。第一次读取也可能比后续读取慢,因为它必须启动到后端的网络信道。我们将考虑随着时间的推移提高性能,但如果您通过网络检索数据,则不能期望0毫秒。

您可能想要启用脱机持久性,这将启用您以前读过的数据的本地缓存。不过,请注意,get()调用仍将尝试首先访问网络,以便尽可能提供最新的数据。如果您使用addSnapshotListener(),我们将立即使用缓存的数据给您打电话,而无需等待网络。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46675765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档