【问题标题】:JavaScript Performance (typeof arr[i] === "undefined" || num < arr[i])JavaScript 性能 (typeof arr[i] === "undefined" || num < arr[i])
【发布时间】:2015-12-25 01:57:20
【问题描述】:

我正在寻找一种方法来避免 typeof 检查每个 arr[i]

我需要适应 arr[i] 可以是 0 的事实

如果arr[i]undefined 或大于num,我想分配arr[i] = num

【问题讨论】:

  • 为什么会是undefined?在数字数组中似乎不是一个有用的值。无论哪种方式,都不需要typeof 检查undefined
  • 这个怎么样:arr[i] = Math.max(arr[i] || 0, num)
  • 为什么你首先需要让如此简单的逻辑变得更快?它不会比这更快。您可以尝试if(!(num &gt;= arr[i])){arr[i]=num;} 之类的方法来反转未定义情况下会发生的情况。

标签: javascript performance micro-optimization


【解决方案1】:

回答性能问题的方法是运行基准测试。

有四种选择:

  1. arr[i] === undefined || num &lt; arr[i]

  2. typeof arr[i] === 'undefined' || num &lt; arr[i]

  3. !(i in arr) || num &lt; arr[i]。这假定 undefined 值是真正的“空洞”(缺少索引),而不是存在但值为 undefined 的索引。

  4. !(num &gt;= arr[i])。这利用了与undefined 比较返回false 的事实。

1 和 2 在性能方面是等效的。 3 大约慢了 20 倍。 4 大约慢 20%。按照另一个答案中的建议使用 isNaN 会慢约 50%。

因此,如果您只对性能感兴趣,请使用 1 或 2。如果您想以较小的性能成本节省击键次数,请使用 4。但是,4 的可读性也较差,您可能需要添加注释关于它如何处理undefined,这将抵消任何击键节省。

http://jsperf.com/ways-to-check-for-undefined/4

【讨论】:

    【解决方案2】:

    检查something === something_else 的速度尽可能快,但使您的代码变慢的是您正在做两件事而不是一件事:

    您正在检查typeof arr[i] === “undefined”num &lt; arr[i],尽管javascript 引擎无论如何都会检查数据类型

    我的意思是,如果typeof arr[i] === “undefined” 是真的,那么num &lt; arr[i] 将永远是假的。 &gt;= 也是错误的,这导致了解决方案。

    代替:

    if (typeof arr[i] === “undefined” || num < arr[i])
    

    你可以这样做:

    if (!(num >= arr[i]))
    

    另一方面...

    • 如果您不知道它当前太慢,如果您没有对其进行分析,那么您不应该优化它。见:When is optimisation premature?

    • 为什么列表中有未定义的数据?您不能在写入列表之前而不是在阅读时过滤掉它吗?在容器中始终只有一种数据类型是个好主意(除非您有非常好的理由)

    • 如果您有一个键值映射,其中一些键未定义,那么数组可能不适合您的用例

    【讨论】:

      【解决方案3】:

      试试这个:

      arr[i] == undefined || num < arr[i]
      

      arr[i]=(arr[i] >= 0 && arr [i] < num) ? arr[i] : num;
      

      或者

      arr[i]=(!isNaN(arr[i]) && arr [i] < num) ? arr[i] : num;
      

      【讨论】:

      • 这会将arr[i] 的负值替换为num,这可能不是OP 的意图。
      • 对于这种情况,您可以尝试使用 isNaN 方法
      • isNaN 似乎比直接检查 undefined 慢 50%。见jsperf.com/ways-to-check-for-undefined/5
      • 哦,感谢更新。对于这种情况,您的第一个选项很酷,但我的建议是不要检查类型 arr[i] == undefined || num &lt; arr[i]
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 2021-01-26
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      相关资源
      最近更新 更多