JSON喜欢语法vs switch语句javascript

时间:2013-08-20 16:22:10

标签: javascript json

我在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

有什么想法吗?

4 个答案:

答案 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)

  • 我相信Javascript对象是一个关联数组 通常实现为哈希表。每次查找都需要一个密钥 通过散列函数。哈希函数就像一个双刀片。对于小尺寸数据,它会比if-elseif-else慢。但是,对于较大的数据,它将胜过普通的if-elseif-else
  • 你赞成switch是非常不公平的,你在第一种情况下做出你要找的变量。因此,switch的复杂性对于您的测试来说是O(1)。

答案 3 :(得分:1)

通常switch语句由编译器/解释器优化。它们甚至比链式if-else语句更快。通过使用JSON对象而不是switch语句,您绕过了Javascript引擎优化。