三元语句比 JavaScript 中的 if/then/else 语句更快吗?

问题描述 投票:0回答:5

我看到很多:

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

在 JavaScript 中。这比

更快吗?
var something;
if (is_something_true()) {
    something = 3;
} else {
    something = 4;
}

还是为了方便写得简洁?

javascript performance ternary-operator
5个回答
7
投票

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

这是链接

different results!

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

就速度而言应该没有区别。除非你使用的是非常糟糕的 javascript 实现。两个语句中最慢的部分是分支。


4
投票

你应该首先考虑可读性,然后再进行微小的优化一百五十秒。在许多情况下,第一种形式更容易阅读,并且无论哪种方式,性能可能没有太大差异。

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


4
投票

这是统计数据enter image description here

经过多次测试和观察,可以得出结论,大多数情况下三元运算符(

?:
)比
if/else
慢。


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

注意: 注释其中一部分并执行代码并运行循环进行大量迭代(上面的代码有数百万次迭代)。

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


0
投票

我修改了 Zaheen 所做的 this 测试,使其在 if...else 和三元上运行测试 50 次,并自动将每个结果和平均值的列表输出到控制台,并且它始终给我一个当我在 Microsoft Edge 的控制台中运行时,三元的速度比 if...else 的速度稍快。

var lista = []
var listb = []
var ib = 0
var ic = 0
for(; ib < 50; ib++) {
// 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)
lista.push(endTime)
}
for(; ic < 50; ic++) {
// 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)
listb.push(endTime)
}
var averagea = 0
lista.forEach(v=>averagea+=v)
averagea/=lista.length
var averageb = 0
listb.forEach(v=>averageb+=v)
averageb/=listb.length
console.log({ifelse: {times: lista, average: averagea+" ms"}, ternary: {times: listb, average: averageb+" ms"}})

以下是我从 Microsoft Edge 控制台获得的结果:

{
    "ifelse": {
        "times": [
            166,
            143,
            148,
            161,
            151,
            138,
            135,
            148,
            150,
            154,
            150,
            148,
            143,
            140,
            150,
            141,
            157,
            140,
            150,
            152,
            185,
            223,
            198,
            160,
            147,
            144,
            156,
            173,
            154,
            170,
            152,
            165,
            150,
            150,
            147,
            146,
            136,
            146,
            147,
            146,
            143,
            146,
            140,
            141,
            153,
            147,
            143,
            136,
            146,
            156
        ],
        "average": "152.22 ms"
    },
    "ternary": {
        "times": [
            144,
            148,
            159,
            139,
            138,
            144,
            143,
            148,
            137,
            142,
            152,
            147,
            147,
            157,
            146,
            141,
            144,
            142,
            150,
            135,
            147,
            149,
            144,
            139,
            156,
            138,
            144,
            148,
            142,
            143,
            142,
            141,
            146,
            143,
            142,
            143,
            140,
            137,
            139,
            149,
            144,
            137,
            139,
            153,
            138,
            140,
            149,
            151,
            141,
            139
        ],
        "average": "144.12 ms"
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.