在Firestore中,哪种文档快照字段访问方法更快?

时间:2020-02-22 10:42:30

标签: java android firebase google-cloud-firestore

我已成功创建查询以从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
            }
        }
    }
});

2 个答案:

答案 0 :(得分:1)

 String name = document.getString("name"); //Second option 

它是最快的,并且内存效率很高,因为没有任何额外的对象创建部分。

答案 1 :(得分:1)

每当出现“更快”的问题时,答案总是“您应该对它们进行基准测试以获得实际数字”。

但是我会说前两个选项之间的实际差异可以忽略不计。它们本质上都是恒定时间地图查找。您可以尝试对它们进行基准测试,但是它们都将是如此之快,因此在实践中并不重要。我认为您不应该花时间尝试对其进行优化。

第三个选项总是最慢的,因为Firestore SDK必须对模型对象执行反射,以找到所有的setter方法或公共字段以映射文档字段数据。这是最方便的。您将使用toObject节省键入时间,但速度不会如此之快。但是,它可能足够快,并且您可能仍在浪费时间尝试对其进行优化。

底线是这样的:不要花时间优化一些实际上并不慢的东西。您可能花了太多时间,如果速度太慢,可以随时对其进行改进。