gpt4 book ai didi

javascript - 链接多个 Array.prototype.*function* 的性能问题是什么?

转载 作者:行者123 更新时间:2023-12-01 01:48:02 25 4
gpt4 key购买 nike

假设我有一个函数 f,它会迭代 n 元素的数组,以使用 k 条件对其进行过滤。

为了提高可读性,我会想这样写:

result = array
.filter(predicate1)
.filter(predicate2)
.filter(predicate3)
.filter(...)

特别是为了避免编写这样的内容:

result = array.filter(e => test1(e) && test2(e) && test3(e) && ...)

当然,上面看起来不错,但是如果我有多个测试很难写好,最终会变成一团糟的缩进......(请考虑这一点)

k 个谓词。复杂度似乎是O(k*n),对吧?

如果出现以下情况,性能风险是什么:

  • 数组中有很多元素(假设很多,我真的很欣赏你对很多的定义)
  • 我们每秒执行函数 f 多次甚至更多
  • 也可以执行其他类似的功能

我采用了过滤器的情况,因为我刚刚遇到过它,但是这个问题适用于迭代数组或其他可迭代对象时使用的任何链式方法。

编辑:

事实上,我真正想知道的是在全局范围内使用这种设计的危险。

当然,对于单个功能来说,这不会引起太多关注。我正在谈论对完整应用程序的影响,其中每个类似的案例都使用更多迭代。

最佳答案

性能风险很简单,即重复迭代(和/或创建然后回收这些临时数组)而不是单次迭代所需的时间会在应用程序中产生可感知的延迟,也许仅在功能较低的硬件上。一般建议是:编写清晰且可维护的内容,如果/当您需要担心性能问题时,请担心性能问题。

从您问题中的信息无法判断您是否会得到一个。您说过数组中有“很多”条目,但是“很多”并没有告诉我们太多信息。 :-) 您还说过您将每秒进行几次此处理,这确实表明您最好不要不必要地循环数组并创建中间数组。但您的里程可能会有所不同。

如果您经常遇到这种情况,您可以考虑为自己提供一些实用函数,例如:

function multiAndFilter(array, ...filters) {
return array.filter(entry => filters.every(entry));
}
function multiOrFilter(array, ...filters) {
return array.filter(entry => filters.some(entry));
}

...依此类推,然后:

result = multiAndFilter(array, predicate1, predicate2, predicate3);

关于javascript - 链接多个 Array.prototype.*function* 的性能问题是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51810671/

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