【问题标题】:Is ternary operator, if-else or logical OR faster in javascript?javascript中的三元运算符,if-else或逻辑OR更快吗?
【发布时间】:2010-04-06 17:18:42
【问题描述】:

在 javascript、if-else、三元运算符或逻辑 OR 中哪种方法更快或更灵敏?出于什么原因,建议使用哪个?

【问题讨论】:

  • 这超出了微优化。这就像纳米优化。你真的会改变你的编码风格来节省 0.0000000000001 毫秒吗?!
  • 如果这些之间的性能差异对您来说真的很重要,那么 Javascript 可能不是正确使用的语言。
  • 为什么我会因为这个问题的答案而如此生气?身份证...

标签: javascript performance


【解决方案1】:

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

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();

Google Chrome v21 中使用 if/else 块而不是三元运算符产生 1.5 - 2x 性能提升在OS X Snow Leopard下。

作为其中一个非常重要的用例,使用 JavaScript 合成实时音频变得越来越普遍。当算法每秒运行 44100 次时,这种类型的性能差异是很重要的。

【讨论】:

  • 今天刚刚发现这个站点/测试:jsperf.com/ternary-vs-switch 这证实了我的发现。但是,当我在 Safari 中使用三元运算符运行测试时,速度会稍微快一些……不想让我们变得简单 :)
  • 在 32Bit Firefox 27 on Windows 8.1 64Bit Ternary 对我来说最快,Switch 最慢,if-else 介于两者之间。
  • 谢谢。当几乎所有优化问题都有正当理由时,我讨厌所有这些人都说“过度优化”。
  • 你是指性能提升(更快)还是时间增加(更慢)?
  • 更快。至少大约三年前...我会自己运行链接的 jsperf 测试,因为这样的结果肯定会发生变化。
【解决方案2】:

我认为@charlie robert 的测试不公平

这是我的jsperf

结果:

  1. 严格相等是最快的
  2. 严格的三元组慢 33%
  3. truthy falsy 慢 49%
  4. 三元真假慢 55%
  5. if else 和三元大致相同。

正常相等和正常三元最慢。

严格等于:

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;

真实/虚假

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;

【讨论】:

    【解决方案3】:

    速度差异可以忽略不计 - 使用您认为更具可读性的任何一个。换句话说,我非常怀疑代码中的瓶颈是否是由于使用了错误的条件构造。

    【讨论】:

    • 应该可以忽略不计。但我们需要测试以确保某些浏览器(如 IE)不会搞砸。
    • 在 JavaScript 中处理数百万数据时,速度很重要
    • 虽然我同意这一点,但问题是问哪种方法更快。又名这个答案并没有真正回答这个问题。 - 实际上我很想知道@Kira 提出的类似原因
    • html5 游戏开发者也将从中受益,我们经常使用 if 语句,因此可以说每一毫秒都很重要 ? 很遗憾。
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

      速度没有区别。

      有些人更喜欢 if/else 以提高可读性。就我个人而言,只要逻辑简单到可以单行理解,我就会使用三元运算符。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        【解决方案7】:

        我正在做另一种语法:

        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;
        

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

        【讨论】:

        • 这个可以简化为b = !a
        【解决方案8】:

        我认为这将有助于找到 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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多