我已成功创建查询以从Firestore获取数据。我的数据库中有这些数据:
- products
- docId
- name: "bacon"
- category: "food"
- price: 44
查询时,我得到一个QueryDocumentSnapshot,并且发现了三种获取name
属性值的方法。哪个更快,更可能被使用?
query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
Map<String, Object> map = document.getData();
String name = map.get("name").toString(); //First option
String name = document.getString("name"); //Second option
Product product = document.toObject(Product.class);
String name = product.getName(); //Third option
}
}
}
});
答案 0 :(得分:1)
String name = document.getString("name"); //Second option
它是最快的,并且内存效率很高,因为没有任何额外的对象创建部分。
答案 1 :(得分:1)
每当出现“更快”的问题时,答案总是“您应该对它们进行基准测试以获得实际数字”。
但是我会说前两个选项之间的实际差异可以忽略不计。它们本质上都是恒定时间地图查找。您可以尝试对它们进行基准测试,但是它们都将是如此之快,因此在实践中并不重要。我认为您不应该花时间尝试对其进行优化。
第三个选项总是最慢的,因为Firestore SDK必须对模型对象执行反射,以找到所有的setter方法或公共字段以映射文档字段数据。这是最方便的。您将使用toObject节省键入时间,但速度不会如此之快。但是,它可能足够快,并且您可能仍在浪费时间尝试对其进行优化。
底线是这样的:不要花时间优化一些实际上并不慢的东西。您可能花了太多时间,如果速度太慢,可以随时对其进行改进。