基于if-else,switch或map的调节的性能


73

我想知道以下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/";
}           

方法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;

}

方法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];

方法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];

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


最慢的事情是将值作为字符串传递
Luka Rahne 2011年

1
这是一个基准:jsben.ch
#

4
微观优化:浏览器中发生了很多事情,例如js编译,重排,重绘等,这些都不影响性能。就像尝试将毫米最小化一样,您仍然只有一米,这只是在浪费时间并破坏头脑。我建议根据环境选择最漂亮的代码,例如,除非使用绑定,否则不能对对象方法使用映射。并且为了进行优化,您最好使用chrome性能工具来发现真正的瓶颈,并确保您会发现甚至没有想到的严重问题。
阿里

Answers:


72

根据此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绝对会取胜:将映射存储在一个变量中,并在以后引用此变量,而不用重新构造它。


是的 结果似乎几乎与我的相似。但是,如果案件数量急剧增加,它们会有所不同吗?
aditya_gaur 2011年

我已经对测试进行了扩展,并且3和4绝对是赢家:jsperf.com/performance-of-assigning-variables-in-javascript/2
Rob W

4
此外,在现实生活中,在任何一种方法之间您都不会获得任何明显的性能提升,并且方法3更具可读性,在以后的阶段更容易更改,并且效果与条件/数据完全隔离。所以这是双赢的。
juandopazo 2011年

我已经使用FF 56.0 64bit完成了测试,方法1是最快的。与其他方法相比,该映射器确实很慢。FF出问题了?
低于雷达

1
使用Chrome 62和改进的脚本(仅创建地图一次),我看不到方法1到方法3之间的任何一致或显着差异
。– mhchem

18

您总是可以自己进行jsPerf测试。但是,通常,查找表是访问数据的最快方法。那将是您的摘要中的(3)。此外,switch/case几乎总是比快if-else。因此,您的示例的顺序是

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


在许多语言中,编译器将switch语句转换为查找表,因此我实际上希望后者在这些情况下最快。虽然不确定使用JS的浏览器。
Ohad Schneider


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.