if-else,switch或基于map的条件的性能

adi*_*aur 62 javascript if-statement switch-statement

我想知道javascript中以下条件结构的实现的性能.

方法1:

 if(id==="camelCase"){
    window.location.href = "http://www.thecamelcase.com";
}else if (id==="jsFiddle"){
    window.location.href = "http://jsfiddle.net/";
}else if (id==="cricInfo"){
    window.location.href = "http://cricinfo.com/";
}else if (id==="apple"){
    window.location.href = "http://apple.com/";
}else if (id==="yahoo"){
    window.location.href = "http://yahoo.com/";
}           
Run Code Online (Sandbox Code Playgroud)

方法2:

switch (id) {
case 'camelCase':
    window.location.href = "http://www.thecamelcase.com";
    break;
case 'jsFiddle':
    window.location.href = "http://www.jsfiddle.net";
    break;
case 'cricInfo':
    window.location.href = "http://www.cricinfo.com";
    break;
case 'apple':
    window.location.href = "http://www.apple.com";
    break;
case 'yahoo':
    window.location.href = "http://www.yahoo.com";
    break;

}
Run Code Online (Sandbox Code Playgroud)

方法3

var hrefMap = {
camelCase : "http://www.thecamelcase.com",
jsFiddle: "http://www.jsfiddle.net",
cricInfo: "http://www.cricinfo.com",
apple: "http://www.apple.com",
yahoo: "http://www.yahoo.com"
};
window.location.href = hrefMap[id];
Run Code Online (Sandbox Code Playgroud)

方法4

window.location.href = {
    camelCase : "http://www.thecamelcase.com",
    jsFiddle: "http://www.jsfiddle.net",
    cricInfo: "http://www.cricinfo.com",
    apple: "http://www.apple.com",
    yahoo: "http://www.yahoo.com"
}[id];
Run Code Online (Sandbox Code Playgroud)

可能方法3和4可能具有几乎相同的性能,但只是发布以确认.

Rob*_*b W 63

根据这个JSBen.ch测试,switch设置是提供的方法中最快的(Firefox 8.0和Chromium 15).

方法3和4的速度稍慢,但几乎不可察觉.显然,if-elseif方法明显变慢(FireFox 8.0).

在Chromium 15中的相同测试未显示这些方法之间的性能的显着差异.事实上,if-elseif方法似乎是Chrome中最快的方法.

更新

再次运行测试用例,另外还有10个条目.hrefmap(方法3和4)显示出更好的性能.

如果要在函数中实现compare方法,方法3肯定会获胜:将映射存储在变量中,稍后引用此变量,而不是重构它.

  • 此外,在现实生活中,任何这些方法之间都不会有任何明显的性能提升,方法3更易读,更容易在后期更改,并且效果与条件/数据完全分离.所以这是双赢的. (4认同)
  • 我认为这个测试有缺陷。对象映射应该在基准设置期间创建,而不是基准计时的一部分,因为在现实世界中,它将用作单例/定义一次并重复使用。这样做表明映射器是明显的赢家:http://jsben.ch/5L2sG (2认同)

jAn*_*ndy 17

你总是可以自己做一个jsPerf测试.但是,通常查找表是访问数据的最快方式.那将是(3)你的片段.而且,switch/case几乎总是比if-else.所以你的例子的顺序是

(3) - > (4) - > (2) - > (1)