4

我用谷歌搜索了一下,但我仍然觉得迷路了。我正在用 JavaScript 编写一个 CPU 模拟器(目前在我的情况下是 Z80)。它的内心有一个巨大的switch语句。虽然我当然可以运行一些基准测试,但我不能确定未来不同浏览器的 JavaScript 引擎(好吧,没有人可以,我知道,但是这里应该有人比我更了解不同浏览器的 JavaScript 引擎...... )。

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

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

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

在我的 switch 构造中声明我只使用数字(和整数——尽管它在 JavaScript 中并不意味着太多,因为 AFAIK 它只有一种数字类型)值可能很重要。

4

4 回答 4

6

至少与必须评估许多s 和sswitch一样快。即使不了解 JavaScript 引擎和优化器的内部,我们也可以肯定地知道这一点。ifelse

对于像您这样的解释器,最好将函数存储在字典(数组)中,并在该数组中对代码进行二进制查找。

因此,使用您将放入案例中的代码作为索引和 JavaScript 代码(函数)作为值创建一个数组,然后执行您在数组中找到的代码。

于 2013-09-16T14:39:12.793 回答
3

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

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

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

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

于 2013-09-16T14:41:06.780 回答
0

大约 1000 次迭代和随机采样,ifswitch相互反弹。差异在 5% 到 15% 之间变化。应该不会很明显吧。当您将其提高到 100000 时,switch总是以相同的百分比获胜。这是可以预料的,因为switch读取一次并与多次比较,而if读取多次并与多次比较。

但是值得注意的是,使用一个new Map()对象来查找结果会完全消除其中任何一个。

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

于 2020-06-11T13:38:41.930 回答
-1

当需要检查很多情况时, Switch比所有现代浏览器中的地图查找要慢得多。查看基准:

于 2020-03-08T08:33:05.560 回答