是三元运算符,if-else或逻辑或更快的javascript?

时间:2010-04-06 17:18:43

标签: javascript performance

在javascript,if-else,三元运算符或逻辑OR中哪种方法更快或响应更快?哪个是可取的,出于什么原因使用?

8 个答案:

答案 0 :(得分:117)

似乎没人做任何实际的分析。这是我使用的代码:

test = function() {
    for (var i = 0; i < 10000000; i++) {
        var a = i < 100 ? 1 : 2;

        /*
        if(i < 100) {
            var a = 1;
        }else{
            var a = 2;
        }
        */
    }
}

test();

使用if / else块代替三元运算符会在 Google Chrome v21中产生 1.5 - 2x 性能提升 OS X Snow Leopard下的

作为非常重要的一个用例,综合实时音频在JavaScript中变得越来越普遍。当算法每秒运行44100次时,这种性能差异是一个大问题。

答案 1 :(得分:21)

我没想到@charlie robert的考试是公平的

这是我的jsperf

结果:

  1. 严格相等是最快的
  2. 严格三元是慢33%
  3. truthy falsy慢了49%
  4. 三分之一的虚假法则慢了55%
  5. 如果其他和三元大致相同。
  6. 正常等于和正常三元最慢。

    严格等于:

    var a = true, b;
    
    if (a === true) {
      b = true;
    } else {
      b = false
    }
    if (a === false) {
      b = true;
    } else {
      b = false;
    }
    

    三元严格等于

    var a = true, b;
    
    b = (a === true) ? true : false;
    
    b = (a === false) ? true : false;
    

    简单平等

     var a = true, b;
    
        if (a == true) {
          b = true;
        } else {
          b = false;
        }
    
        if (a == false) {
          b = true;
        } else {
          b = false;
        }
    

    简单的三元相等

     var a = true, b;
        b = (a == true) ? true : false;
    
        b = (a == false) ? true : false;
    

    truthy / falsy

    var a = true, b;
    if (a) {
      b = true;
    } else {
      b = false;
    }
    
    if (!a) {
      b = true;
    } else {
      b = false;
    }
    

    三元/虚假

    var a = true, b;
    b = (a) ? true : false;
    b = (!a) ? true : false;
    

答案 2 :(得分:17)

速度差异可以忽略不计 - 使用您发现的更具可读性。换句话说,我高度怀疑代码中的瓶颈是由于使用了错误的条件构造。

答案 3 :(得分:2)

对于查理罗伯茨上面的回答,我想补充一下:

以下链接提供了一些精辟的答案; Firefox中交换机的结果是最引人注目的: http://jsperf.com/if-else-vs-arrays-vs-switch-vs-ternary/39

那些质疑为什么有人会调查这种程度的优化的人会很好地研究WebGL!

答案 4 :(得分:1)

三元运算符只是语法糖,而不是性能助推器。

答案 5 :(得分:0)

我认为这将有助于找到 if..else 和三元运算符的确切速度差异。我检查了三元和 if else 的不同类型的嵌套条件。它显示三元比 if..else 语句(Nodejs 控制台、Chrome 和 Edge)更快,但在 Firefox 的情况下,显示相反的结果(Windows 10)。下面的代码给出了两个测试的平均 40 毫秒。

const IfTest = () => {
  let sum = 0;
  for (let x = 0; x < 1e8; ++x) {
    if (x % 2 === 0) 
     sum += x;
    else if (x > 1e8 / 2) 
     sum += 5;
    else 
     sum += 6;
  }
};

const TernaryTest = () => {
  let sum = 0;
  for (let x = 0; x < 1e8; ++x) {
    sum += x % 2 === 0 ? x : x > 1e8 / 2 ? 5 : 6;
  }
};

const initTest = (e) => {
  let [tAverage, ifAverage] = [0, 0];
  for (let x = 0; x < e; ++x) {
    const date = new Date;
    IfTest();
    ifAverage += new Date - date;
  }
  console.log("if execution time:", ifAverage / e);

  for (let x = 0; x < e; ++x) {
    const date = new Date;
    TernaryTest();
    tAverage += new Date - date;
  }
  console.log("ternary execution time:", tAverage / e);
};

initTest(40);

答案 6 :(得分:-1)

速度没有区别。

有些人更喜欢if / else的可读性。就个人而言,只要逻辑很小,就可以在一行上理解,我就会使用三元运算符。

答案 7 :(得分:-1)

我正在使用另一种语法:

var a = true,
    b;

b = (a == false) 
    ? true // if a == false, b = true
    : false; // else: a == true so b = false

    /* Equivalent of
    if(a == true)
      var b = true;
    else
      var b = false;

有些人喜欢我的代码,并告诉我它很容易阅读。