Firestore 文档 get() 性能
Firestore document get() performance
刚开始探索 Firestore 存储和要做的第一件事 - 通过文档密钥(使用 Google 进行身份验证,但可能并不重要)在我的 Android 应用程序中读取一个简单的小文档。这是一个片段:
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) 是非空的,所以大小不是问题。 运行 真实 phone 上的应用程序,Android 7.1
上的 Nexus 6
问题:我做错了什么?我基本上使用了操作指南 "Getting data" 中的示例。
这样的读取需要 0 毫秒。如果没有解决方法,我想我必须放弃将实时存储作为应用程序唯一存储的想法,回到普通 SQLite 并使用 Firebase/Firestore 作为单独的云存储。
UPDATE 从版本 16.0.0 开始 DocumentReference.get() and Query.get() 有一个新参数 "source" 允许控制从何处读取数据 - 只有服务器,仅缓存或尝试服务器然后缓存。
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
这些 get()
请求正在通过网络从 Cloud Firestore 后端读取数据,因此它们必然比仅从磁盘本地读取的 SQLite 慢得多。第一次读取也可能比后续读取慢,因为它必须启动到后端的网络通道。我们将着眼于随着时间的推移提高性能,但如果您通过网络检索数据,则不能期望 0 毫秒。
您可能想要 enable offline persistence 这将启用您之前阅读过的数据的本地缓存。请注意,尽管 get()
调用仍会尝试首先访问网络,以便为您提供尽可能最新的数据。如果您改用 addSnapshotListener()
,我们会立即使用缓存数据给您打电话,而无需等待网络。
刚开始探索 Firestore 存储和要做的第一件事 - 通过文档密钥(使用 Google 进行身份验证,但可能并不重要)在我的 Android 应用程序中读取一个简单的小文档。这是一个片段:
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) 是非空的,所以大小不是问题。 运行 真实 phone 上的应用程序,Android 7.1
上的 Nexus 6问题:我做错了什么?我基本上使用了操作指南 "Getting data" 中的示例。
这样的读取需要 0 毫秒。如果没有解决方法,我想我必须放弃将实时存储作为应用程序唯一存储的想法,回到普通 SQLite 并使用 Firebase/Firestore 作为单独的云存储。
UPDATE 从版本 16.0.0 开始 DocumentReference.get() and Query.get() 有一个新参数 "source" 允许控制从何处读取数据 - 只有服务器,仅缓存或尝试服务器然后缓存。
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
这些 get()
请求正在通过网络从 Cloud Firestore 后端读取数据,因此它们必然比仅从磁盘本地读取的 SQLite 慢得多。第一次读取也可能比后续读取慢,因为它必须启动到后端的网络通道。我们将着眼于随着时间的推移提高性能,但如果您通过网络检索数据,则不能期望 0 毫秒。
您可能想要 enable offline persistence 这将启用您之前阅读过的数据的本地缓存。请注意,尽管 get()
调用仍会尝试首先访问网络,以便为您提供尽可能最新的数据。如果您改用 addSnapshotListener()
,我们会立即使用缓存数据给您打电话,而无需等待网络。