用于处理javascript中较大数组的功能或命令式代码?

时间:2019-02-18 12:21:44

标签: javascript ecmascript-6 functional-programming

在javascript中使用数组时,您会选择什么,功能性方式或命令性方式,而命令式要比功能性更快。我很困惑。

Here is the jsPerf test我用普通的for循环以及一对贴图和过滤器来

2 个答案:

答案 0 :(得分:2)

我的两分钱: 通常,我更喜欢对数组使用函数式方法,因为我发现函数式方法更灵活,更易于阅读和维护。

尤其是在性能要求不高或差异不明显的地方。

让我们说,该功能方式是常规循环的50倍。如果常规循环需要1毫秒,则意味着功能需要50毫秒,在大多数情况下还可以。

因此,在那种情况下,我不会牺牲我的代码进行优化,尤其是在应用程序和/或共享存储库中。

但是,当我编写视频游戏代码时,通常会尝试进行常规循环。出于性能原因,而且还因为在这种情况下通常必须处理字节数组,而我发现函数式编程不太灵活。

说:在JS中,数组方法的问题在于它们不惰性。在您的情况下,这意味着您要遍历两次数组,因为您调用了两个方法(filtermap)。在其他语言(例如Rust)中,这种方法是“惰性”的,只有在您实际使用迭代器进行操作之前,它们才会被调用:与常规循环相比,可以减少性能问题。

JS中有一个库支持惰性方法(例如RxJS在可观察状态),因此,如果您正在中间寻找某些东西,则可能要检查它们(在仍使用功能性方法的情况下节省一些性能)。

答案 1 :(得分:0)

Array.map与for循环之间的区别在于,for循环只对数组的值进行迭代。在循环体内,您可以使用这些值执行任何操作。 Array.map的作用远不止这些。它遍历数组,创建一个新数组,并在每个值上调用该回调的值。

我认为您应该在Array.map上尽可能多地使用for循环,尽管这样做要快得多。当您要创建一个在原始数组中具有突变值的新数组时,请使用Array.map

基本上,这些与:

循环:

const array = [1, 2, 3];
const mutatedArray = [];

for(let i = 0; i < array.length; i++) {
    let mutatedValue = array[i] * 2;

    mutatedArray.push(mutatedValue);
}

Array.map:

const array = [1, 2, 3];
const mutatedArray = array.map(x => x * 2);

编写起来更加干净快捷。