【问题标题】:Functional or Imperative code for dealing with considerably large array in javascript?用于处理 javascript 中相当大的数组的函数式或命令式代码?
【发布时间】:2019-02-18 12:21:43
【问题描述】:

在 javascript 中使用数组时,您会选择什么方式,函数式方式还是命令式方式,而命令式比函数式更快。我很困惑。

Here is the jsPerf test 我用普通的 for 循环和一对映射和过滤器运行。

【问题讨论】:

  • 这取决于你的需要......顺便说一句,这不是一个真正的编程问题恕我直言,我不认为它属于 SO。
  • 命令式更快。快多了。它也更长,更容易出错。它可能不太可读。 当然更难测试。 “相当大”有多大?目前没有办法回答这个问题。理论上的微优化问题在这里通常不受欢迎。您的具体用例是什么?
  • 如果你了解函数式编程,你的代码会更干净、更小、更不容易出错,从而大大提高效率——开发人员的效率,这比执行速度重要得多。不要过早地进行优化。

标签: javascript ecmascript-6 functional-programming


【解决方案1】:

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

尤其是在性能不重要或没有明显差异的情况下。

假设函数式方法的时间是常规循环的 50 倍。如果一个常规循环需要 1 毫秒,这意味着函数需要 50 毫秒,并且在大多数情况下仍然可以。

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

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

说:在JS中,数组的方法的问题是它们并不懒惰。这意味着,在您的情况下,您将迭代两次数组,因为您调用了两个方法(filtermap)。在其他语言(例如 Rust)中,此类方法是“惰性的”,并且在您实际使用迭代器执行某些操作之前不会调用它们:与常规循环相比,这减少了您可能遇到的性能问题。

JS 中有一些支持惰性方法的库(例如,可观察的 RxJS),因此如果您正在寻找中间的东西(在仍然使用函数式方法的同时节省一些性能),您可能需要检查这些库。

【讨论】:

    【解决方案2】:

    Array.map 和 for 循环之间的区别在于,for 循环仅对数组的值进行迭代。在循环体内,您可以对这些值执行任何操作。 Array.map 不仅如此。它遍历数组,创建一个新数组,其中包含对每个值调用的回调值。

    在我看来,您应该在Array.map 上尽可能多地使用 for 循环,虽然它要快得多。当您想在原始数组中创建具有变异值的新数组时,请使用 Array.map

    基本上这些是一样的:

    for循环:

    const array = [1, 2, 3];
    const mutatedArray = [];
    
    for(let i = 0; i < array.length; i++) {
        let mutatedValue = array[i] * 2;
    
        mutatedArray.push(mutatedValue);
    }
    

    数组.map:

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

    写起来更干净、更快捷。

    【讨论】:

      猜你喜欢
      • 2019-09-03
      • 1970-01-01
      • 2014-03-20
      • 2011-09-30
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 2016-02-28
      • 2011-06-03
      相关资源
      最近更新 更多