我已经谷歌了一下,但我还是觉得迷路了。我正在用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它只有一个数字类型)值非常重要。
提前多多感谢。
答案 0 :(得分:5)
switch
至少与一样,因为必须评估许多if
和else
s。即使不了解JavaScript引擎和优化器的内部,我们也知道这一点。
如果是你的情况下的解释器,最好将函数存储在字典(数组)中,并对该数组中的代码进行二进制查找。
因此,创建一个数组,其中包含您将作为索引和JavaScript代码(函数)作为值放在案例中的代码,并只执行您在数组中找到的代码。
答案 1 :(得分:2)
switch
显然会比if
- else
更快,因为它在恒定时间内运行,只需要一次查找。不明确的情况可能是查找表。
我已经修改了jsperf的现有测试用例供您比较:
http://jsperf.com/if-switch-lookup-table/18
查找表实现是三者中最快的。
答案 2 :(得分:0)
在很多情况下要检查的情况下,切换速度比所有现代浏览器中的地图查找慢得多。查看基准:
答案 3 :(得分:0)
在大约1000次迭代和随机采样后,if
和switch
彼此反弹。差异约为5%至15%。它可能不会引起注意。当您将其提高到100000时,switch
总是以大约相同的百分比获胜。这是意料之中的,因为switch
读取一次并与许多进行比较,而if
读取多次并与许多进行比较。
但是值得注意的是,使用new Map()
对象来查找结果完全使它们中的任何一个都消失了。