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

最佳答案

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

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

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

底线是:不要花时间优化一些实际上并不能衡量缓慢的东西。您可能会花太多时间在上面,如果它太慢,可以随时对其进行改进。

10-07 19:35
查看更多