【问题标题】:What's the performance difference between "skip if condition" and "directly return"?“skip if condition”和“direct return”在性能上有什么区别?
【发布时间】:2019-08-06 06:47:39
【问题描述】:

以下 2 个函数之间是否存在性能差异:

function a() {
    var a = false;
    if(a == true) {
           ... Many lines, e.g. 1 million lines ...
    }
}

function b() {
    var a = false;
    if (a != true) {
        return;
    }
           ... Many lines, e.g. 1 million lines ...
 }

哪个执行时间更短?

【问题讨论】:

  • b 的可读性更好。如果范式尽早退出,经常退出与您相关。
  • 我会做if (a !== true) { 来消除可能的类型转换错误。我不认为这里的性能差异是需要考虑的地方。
  • 我想说性能上没有区别。人们倾向于选择if (a !== true) return; 而不是if (a === true) 的原因是前者更容易阅读和理解,尤其是当你有“100 万行代码”时。
  • if(a) 检查所有假条件,但 if (a !== true) 仅检查布尔真

标签: javascript if-statement return execution-time


【解决方案1】:

第二个函数的解析和运行时间应该少于第一个函数,无论是在页面加载时还是在函数执行时。

在页面加载时,解释器必须检查所有文本,检查其语法是否有效,从结果构造抽象语法树,然后(在较新的引擎上)将结果编译为机器代码。即使大部分a 函数体从未执行,它仍然必须被解析。解析 100 万行 Javascript 并非易事。

当每个函数执行时,a 的运行时间可能比 b 多,即使只是一点点 - 例如,如果 a 在这些行中定义了许多变量,范围为a的变量:

function a() {
    var a = false;
    if(a) {
      var b = 'b';
      var c = 'c';
      // more lines
    }
}

当函数运行时,解释器必须查看在if 块中定义的所有变量,这些变量从不运行,以便可以正确初始化这些变量名称。函数运行时,var b;var c;任何其他vars 将被提升到顶部:

function a() {
  var a;
  var b;
  var c;
  // initialize any other variables local to this function
  a = false;
  if(a) {
    b = 'b';
    c = 'c';
    // more lines
  }
}

如果有很多变量要初始化,这可能会导致函数花费的时间比没有变量要初始化的时间长。

相比之下,一个没有多余变量要初始化,也没有太多行要解析的函数:

function b() {
    var a = false;
    if (a != true) {
        return;
    }
 }

将被更快地解析、编译和运行。

【讨论】:

    【解决方案2】:

    我认为没有性能差异,但第二个函数的可读性更好,因为您不必缩进。您也可以在第二个函数的 if 语句中使用 !a 以获得更好的可读性。

    【讨论】:

      猜你喜欢
      • 2013-11-18
      • 2014-05-24
      • 2011-08-26
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多