gpt4 book ai didi

javascript - 为什么使用 for 比 some() 或 filter() 更快

转载 作者:行者123 更新时间:2023-11-30 06:57:50 25 4
gpt4 key购买 nike

我尝试了两种不同的方式来做某事,我对性能结果感到惊讶:

我有一个函数的两个版本:

使用 for :

$scope.hasBlockResult = function (IS, area, block) {
if (!block)
return false;
for (var i = 0; i < $scope.filteredCartoList.length; i++) {
if ($scope.filteredCartoList[i].informationSystem === IS
&& $scope.filteredCartoList[i].area === area
&& $scope.filteredCartoList[i].block === block)
return true;
}
return false;
};

并使用 some() 函数:

$scope.hasBlockResult = function (IS, area, block) {
if (!block)
return false;

return ($scope.filteredCartoList.some(function (carto) {
if (carto.informationSystem === IS && carto.area === area && carto.block === block)
return true;
return false;
}));
};

同样的事情:

for 之间:

for (var i = 0; i < $scope.filteredCartoList.length; i++) {
if ($scope.filteredCartoList[i].informationSystem == IS
&& $scope.filteredCartoList[i].type != 'AM'
&& $scope.filteredCartoList[i].type != 'IF'
&& $scope.filteredCartoList[i].area == area
&& $scope.filteredCartoList[i].block == block)
$scope.resultList.push($scope.filteredCartoList[i]);
}

filter() :

$scope.resultList = $scope.filteredCartoList.filter(function (carto) {
if (carto.informationSystem == IS
&& carto.type != 'AM'
&& carto.type != 'IF'
&& carto.area == area
&& carto.block == block)
return true;
return false;
});

我希望 filter()some() 方法比 for 方法更快,但在这两种情况下,根据到 angularjs batarang 性能选项卡,for 更快。​​

最佳答案

我看了一下 benchmarks你发表在评论中。这些基准测试有一些缺陷:

  • 循环示例在基准测试中使用了 console.timeEndconsole.log,它们都很慢。在撰写本文时,其他示例均未这样做。
  • some 示例执行类型强制转换。
  • 所有测试都在其循环中执行字符串连接。

为了从这些基准中得出任何结论,我们首先需要消除这些偏见来源。

以下是消除了这些偏差后在 8GB DDR3 i5 笔记本电脑上的结果,按照最快到最慢的顺序重新排序(数字越低越好):

OBJECT Average 0.0010666643114139636
SEEK Average 0.00593666957380871
LOOP Average 0.008436664550875625
SOME Average 0.013993332007279
FILTER Average 0.02592999837361276

这些是可以预期的,原因如下:

对象访问

对象访问非常快,因为对象本质上是 HashMap 。无论对象的大小如何,访问元素的速度都是恒定的。

寻找

Seek 的实现是使用 indexOf 定位一个元素,然后在直接数组索引处访问该元素。虽然执行此操作的实际方法是特定于实现的,但它与对象访问非常相似,因此速度非常快。

循环

循环方法速度较慢,主要是因为与“查找”测试不同,循环测试遍历整个数组并进行数组访问和对象访问。 seek 方法不会这样做。它在找到元素后几乎立即爆发。

这意味着除了最坏的情况外,seek 将比 loop 更快。​​

一些

有些具有每次迭代调用函数调用的开销。此外,JIT 编译器根本无法对此进行优化,因为 JIT 编译器不知道您要将什么传递给 some。在最优化的情况下,有些人充其量会执行与循环相同的操作,但由于函数调用,它总是会更慢。

过滤器

Filter 具有“some”的所有注意事项,但它将始终遍历整个数组而不是在单个元素处停止。因此,您应该始终期望 filter 比 for 循环慢得多 - 特别是当您考虑 filter 还创建一个它返回的数组时!

关于javascript - 为什么使用 for 比 some() 或 filter() 更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31459395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com