我在http://www.jquery4u.com/javascript/shorthand-javascript-techniques/上看到了一篇帖子,他谈到了使用switch语句的另一种方法。
我在下面创建了一个片段,但我不确定为什么替代品会慢99%。
function doX(){}
function doY(){}
function doN(){}
var something = 1;
var cases = {
1: doX,
2: doY,
3: doN
};
if (cases[something]) {
cases[something]();
}
http://jsperf.com/alternateswitch
有什么想法吗?
答案 0 :(得分:8)
“JSON”语法只是一个对象。此外,您的比较在这里有点不公平,因为您在每个定时循环中创建一个全新的对象,这有点贵。
如果将对象创建移动到设置部分,速度差异将变为可忽略不计:http://jsperf.com/alternateswitch/4
如果删除if
语句,对象的速度会更快(至少对我而言):http://jsperf.com/alternateswitch/5。额外的属性查找和真实性检查确实会降低它的速度。
答案 1 :(得分:3)
作者从未声称较短的代码,它只是可能情况的哈希映射,实际上会更快。显然,当您在测试套件中运行时,阵列创建会对性能产生负面影响。同时,switch
语句是编译代码。
如果您的代码被重复使用,您会看到一些改进,即您保留cases
的值;我已经在this test case中测量了大约20-30%的差异,具体取决于哪种情况更常发生。
也就是说,除非您的代码在紧密循环中运行,否则诸如此类的隔离性能测试将无用,因为测试用例在我的家用计算机上以每秒50M +操作的速度运行。因此,两者之间的差异应基于其他因素,例如代码清晰度或switch
语句如果忘记放置break;
语句而容易搞砸的事实。
答案 2 :(得分:3)
switch
是非常不公平的,你在第一种情况下做出你要找的变量。因此,switch
的复杂性对于您的测试来说是O(1)。答案 3 :(得分:1)
通常switch
语句由编译器/解释器优化。它们甚至比链式if-else
语句更快。通过使用JSON
对象而不是switch
语句,您绕过了Javascript引擎优化。