我应该在JavaScript中使用大的switch语句而不会出现性能问题吗?

时间:2013-09-16 14:34:08

标签: javascript performance switch-statement

我已经谷歌了一下,但我还是觉得迷路了。我正在用JavaScript编写一个CPU模拟器(目前我是Z80)。内心有一个巨大的转变声明。虽然我当然可以运行一些基准测试,但我不能确定不同浏览器的未来JavaScript引擎(好吧,没有人可以,我知道,但是有些人应该比我更了解不同浏览器的javascript引擎... )。

使用其他构造比使用switch语句更快吗?像一系列函数等。同样类似的问题:我有可能有前缀Z80操作码的情况。交换机的一些“case”分支需要内部的另一个交换机,但不是全部。我想将整个东西转换成一个更大的(但只有一个级别的“深度”)开关构造,使得操作码正常在0-255之间,256-511作为0xDD前缀等等,其中一些将有更多'案例'(对于单个相同的代码,没有中断)。或者我应该尽可能地避免使用大的switch语句,即使是基本操作码表(256'case'分支)?

对于C代码,编译器会在这种情况下创建一个非常快的跳转表。但是关于javascript的是什么?

另一个类似的问题:是否值得拥有一个只有两个'case'分支和一个'default'条目的switch语句,或者它真的是if ... else更好的情况?

在我的switch结构中声明我只使用数字(和整数 - 虽然它在JavaScript中并不意味着太多,因为AFAIK它只有一个数字类型)值非常重要。

提前多多感谢。

4 个答案:

答案 0 :(得分:5)

switch 至少与一样,因为必须评估许多ifelse s。即使不了解JavaScript引擎和优化器的内部,我们也知道这一点。

如果是你的情况下的解释器,最好将函数存储在字典(数组)中,并对该数组中的代码进行二进制查找。

因此,创建一个数组,其中包含您将作为索引和JavaScript代码(函数)作为值放在案例中的代码,并只执行您在数组中找到的代码。

答案 1 :(得分:2)

switch显然会比if - else更快,因为它在恒定时间内运行,只需要一次查找。不明确的情况可能是查找表。

我已经修改了jsperf的现有测试用例供您比较:

http://jsperf.com/if-switch-lookup-table/18

查找表实现是三者中最快的。

答案 2 :(得分:0)

在很多情况下要检查的情况下,切换速度比所有现代浏览器中的地图查找慢得多。查看基准:

答案 3 :(得分:0)

在大约1000次迭代和随机采样后,ifswitch彼此反弹。差异约为5%至15%。它可能不会引起注意。当您将其提高到100000时,switch总是以大约相同的百分比获胜。这是意料之中的,因为switch读取一次并与许多进行比较,而if读取多次并与许多进行比较。

但是值得注意的是,使用new Map()对象来查找结果完全使它们中的任何一个都消失了。

https://jsperf.com/get-speed-comparison