【问题标题】:Are ternary statements faster than if/then/else statements in javascript?三元语句是否比 javascript 中的 if/then/else 语句更快?
【发布时间】:2012-07-07 07:27:23
【问题描述】:

我看到了很多:

var something = (is_something_true()) ? 3 : 4;

在 JavaScript 中。这比

var something;
if (is_something_true()) {
    something = 3;
} else {
    something = 4;
}

还是为了方便而写的简洁?

【问题讨论】:

  • 在现代 JavaScript 运行时它可能没什么区别,但你总是可以test it and see

标签: javascript performance ternary-operator


【解决方案1】:

是的,两者之间的差异可以忽略不计。

但是差异是如此之小,以至于您使用哪个都没有关系(我更喜欢 if/else),因为它们有助于提高可读性,如果有人正在查看您的代码或者您自己查看代码,这将为您节省大量时间可能是在说 3 个月左右之后。

对于那些想要检查差异的人,试试这个代码:

// declarations  
var num1 = 10, num2, i = 0, startTime, endTime, x, y;

// start timer
startTime = Math.floor((new Date()).getTime());

for(; i < 1e8; i++) {
  // first part if /else
  if(x == 10)
    y = x;
  else
    y = 0;

  // second part ternary
  y = (x == 10) ? x : 0;
}

// end timer     
endTime = Math.floor((new Date()).getTime() - startTime);
document.write("Time taken " + endTime + " ms");  

注意:注释其中一个部分并执行代码并运行循环以进行大量迭代(超过代码数百万次迭代)。

提示:尝试多次运行循环以获得平均值。

【讨论】:

    【解决方案2】:

    这里是statisitics:

    经过多次测试和观察,可以得出结论,大多数情况下三元运算符(?:)比if/else慢。

    【讨论】:

    • 是的,以一种完全微不足道和难以察觉的方式。
    • 看这里jsperf.com/test-vs-exp函数的结果(真或假)有更大的影响。
    • @Hogan 但大多数情况下if/else 赢得了比赛。
    • @Engineer - 这不是我现在看到的,只有在 firefox 上才是真的,而且只有两个 firefox 测试。需要更多的测试才能确定。
    • @Hogan 即使在您发布的图片中,也可以看到if/else 获胜。将flow falsetri false 进行比较,将flow truetri true 进行比较。
    【解决方案3】:

    请享受这一点——如果差异在统计上是有效的,那么结果(真或假)也很重要——显然这只是机器上的其他东西对浏览器性能有影响:

    Here is the link

    两者有根本的区别,三元语句是表达式而不是控制流。如果有人将其编写为三元表达式而不是标准的 if / than / else,那么当两者的工作方式相同时(在我看来)它们会在没有充分理由的情况下使代码更难阅读。

    在速度方面应该没有区别。除非您使用的是非常糟糕的 javascript 实现。两个语句中最慢的部分是分支。

    【讨论】:

    • 不错的答案!尤其是三元语句是表达式而不是控制流第二件事,最后你提到了两个语句中最慢的部分是分支 ..你能详细说明一下吗或对此提供一些见解? branching 是什么意思?
    • 顺便说一句,我在这里得到了一些东西docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html
    • @agpt 该链接并不是真正的问题。这是维基百科的解释,比我在评论中所做的要好得多:en.wikipedia.org/wiki/Branch_(computer_science)
    • 链接在 Safari 12.0 中不起作用?我的意思是链接可以,但在页面顶部没有图表,而是“出了点问题”
    【解决方案4】:

    您应该首先编写可读性,然后再编写 150 秒的微小优化。在许多情况下,第一种形式更易于阅读,并且在性能方面可能没有太大差异。

    (即使您不同意并认为第二种形式更易于阅读,询问相对性能差异仍然是错误的问题。)

    【讨论】:

    • 啊,但是可读性真的很难定义。对我(显然还有@Hogan)来说,第二个版本更容易阅读。它似乎更像人类语言。
    • 我的雇主同意你们俩的观点,禁止使用三元运算符。但这只是,就像,你的意见,伙计。我一点也不觉得它更难阅读,而且我一直无法弄清楚为什么有这么多人这样做。
    • 你的雇主不同意我的看法。三元运算符有一席之地,作为运算符而不是作为控制流。他/她应该允许你在适当的时候使用它。
    • 作为一名独立的业余编码爱好者,我并没有真正遵循编码约定并做任何看起来最好的事情,并且主要尝试在各个项目中保持我的编码风格一致,所以有很多情况我可能会使用它是为了好玩。如果它比流更有效,它在涉及嵌套 for 循环的项目中非常有用,每帧运行数千次代码行,因为速度乘数会堆叠,导致延迟显着减少。尽管数据似乎表明情况并非如此,但它仍然更紧凑,更适合代码高尔夫和
    • (我一直在达到字符限制)此外,对于您返回一个值并且不希望有一个可能很庞大甚至具有讽刺意味的是更难的 if/else 语句的情况可能会更好阅读if (condition) { return x; } else { return 0; } vs return condition ? x : 0;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多