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