Cook's Crossfilter tutorial似乎以两种不同的方式完成了结果;
首先通过一般属性定义维度,然后我们应用过滤器。
var delayDimension = cf.dimension(function(d) {return d.delay;});
delayDimension.filter(function(d) {return d > 0});
通过属性d.delay > 0
:
var isDelayedDimension = cf.dimension(function(d) {return d.delay > 0;});
我想知道两种方法在性能方面的差异。
通过特定属性直接定义维度和以更一般的方式定义维度之间的性能是否存在差异,之后我们应用特定的过滤器?
答案 0 :(得分:1)
这些示例有两个不同的用途。
第一个示例中的维度允许您按延迟量进行分组和过滤。
然后,过滤器命令更新维度的过滤器,以便在整个交叉过滤器实例中,只返回行或聚合时使用具有一定延迟的航班。 filter命令势在必行:它不会创建一个过滤的新维度或返回已过滤的行,只需更改该维度的过滤器属性并返回相同的维度。
第二个例子允许你按布尔“是否延迟”进行分组和过滤。它尚未执行任何过滤。要获得与第一个示例中的filter命令相同的效果,您可以执行
isDelayedDimension.filter(true);
同样,这会返回相同的维度,而不是新的维度。它必须跨越过滤器实例过滤数据,以便基于它们的其他维度和组将不再看到任何未延迟的航班。
如果这就是您要做的全部,请根据航班是否延迟进行过滤,然后我认为第二种方法应该稍快一些,但可能不会有明显的差异。它不会改变算法的复杂性,但如果有布尔值而不是整数值,它可能会使排序更容易。
如果出于某种原因,您希望显示汇总或已排序的航班延误信息,并根据航班是否延误进行过滤,那么这将是使用第一个表格的一个原因:它可以执行这两项操作,您可以避免创造第二个维度。尺寸是最昂贵的crossfilter对象。
但是,a group does not observe its own dimension's filters,因此如果您希望在按“已延迟”过滤时更改汇总的延迟信息,则仍需要使用两个维度。