在 JavaScript 中,if-else、三元操作符和逻辑或运算符哪种方法更快或更具响应性?建议使用哪种方法,原因是什么?
在 JavaScript 中,if-else、三元操作符和逻辑或运算符哪种方法更快或更具响应性?建议使用哪种方法,原因是什么?
看起来没有人进行过实际的性能分析。以下是我使用的代码:
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
语句块而不是三元运算符,在OS X Snow Leopard下的Google Chrome v21中可以获得1.5 - 2x的性能提升。
这在一个非常重要的应用场景中很有作用,即在JavaScript中合成实时音频变得越来越普遍。当一个算法每秒运行44100次时,这种性能差异是很重要的。
我认为@charlie robert的测试不公平。
结果:
普通相等和普通三元运算符最慢。
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;
速度差异将是可以忽略不计的 - 使用您认为更易读的任何一种。换句话说,我非常怀疑您的代码瓶颈是否是由于使用了错误的条件结构造成的。
我认为这将有助于找到if..else和三元运算符的确切速度差异。我检查了不同类型的嵌套条件,用于测试三元运算符和if else语句。结果显示,在Nodejs控制台、Chrome和Edge中,三元运算符比if..else语句更快,但在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);
我正在进行另一种语法:
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
。 - riggedCoinfliplet
而不是var
;
不要声明没有值的变量;
使用严格相等;
不要注释明显的东西;
let a = true; let b = !a;
- YAMM速度上没有区别。
有些人喜欢使用if/else语句来提高可读性。个人而言,只要逻辑足够简单易懂,我就会使用三目运算符。