如果两次过滤相同的数据,为什么一旦执行,Array.filter的时间比$ filter多近10倍?

时间:2017-05-27 11:34:18

标签: javascript angularjs performance google-chrome filter

我正在尝试比较角度的$ filter服务和javascript的Array.filter方法所花费的时间。

此问题仅可在chrome中重现。

如果我同时运行这两种方法,那么每次一个过滤器与其他过滤器相比,过滤阵列的时间几乎要多10倍,但是如果我分别运行它们,那么它们两者的时间几乎相等。

使用Array.filter方法: -

arr.filter(function(a){
    return ((a.buyout - 33333333) === 0);
});

使用$ filter: -

$filter('filter')(resp.alliance.auctions, function(data){
      return ((data.buyout - 33333333) === 0);
});

这里有过滤器的任何缓存问题(或功能)吗?

带有工作代码的plnkr: - http://plnkr.co/edit/A5UeZK6Jnafp9SkVBxZi

1 个答案:

答案 0 :(得分:3)

代码优化将在这里发挥作用。将首先执行的代码变体将首次访问返回的结构。 Chrome可能在第一次访问实际发生之前保存了一些资源,但是一旦您 进行访问,Chrome就必须动态访问这些数据。

当您更改实际执行的顺序时,例如通过将Array#filter块包装在setTimeout中,您会注意到$filter方法会消耗更多时间,{ {1}}一个胜利。实际上,首先执行的开销比第二个开销更多。

为了进行正确的比较,您必须首先访问输入数组Array#filter而不测量时间,然后才执行这两个变体,以便它们在相同的情况下尽可能多地启动。

通过以下安排,时间消耗的差异非常小:

$filter

查看您的updated plunker