我看到很多:
var something = (is_something_true()) ? 3 : 4;
在 JavaScript 中。这比
更快吗?var something;
if (is_something_true()) {
something = 3;
} else {
something = 4;
}
还是为了方便写得简洁?
请享受这个 - 如果差异在统计上有效,那么结果(真或假)也很重要 - 显然这只是机器上影响浏览器性能的其他东西:
两者之间有一个根本的区别,三元语句是表达式而不是控制流。如果有人将其编写为三元表达式而不是标准的 if/than/else,那么当两者的工作原理相同时,它们(在我看来)会使代码在没有充分理由的情况下更难以阅读。
就速度而言应该没有区别。除非你使用的是非常糟糕的 javascript 实现。两个语句中最慢的部分是分支。
你应该首先考虑可读性,然后再进行微小的优化一百五十秒。在许多情况下,第一种形式更容易阅读,并且无论哪种方式,性能可能没有太大差异。
(即使您不同意并认为第二种形式更容易阅读,询问相对性能差异仍然是错误的问题。)
是的,两者之间的差异可以忽略不计。
然而,差异是如此之小,以至于你使用哪一个并不重要(我更喜欢 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");
注意: 注释其中一部分并执行代码并运行循环进行大量迭代(上面的代码有数百万次迭代)。
提示: 尝试多次运行循环以获得平均值。
我修改了 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"
}
}