我正在用 go 编写一个简单的模拟器(我应该吗?还是应该回到 c?)。
不管怎样,我正在获取指令并对其进行解码。此时我有一个像 0x81 这样的字节,我必须执行正确的函数。
我应该有这样的东西吗
func (sys *cpu) eval() {
switch opcode {
case 0x80:
sys.add(sys.b)
case 0x81:
sys.add(sys.c)
etc
}
}
或者类似的东西
var fnTable = []func(*cpu) {
0x80: func(sys *cpu) {
sys.add(sys.b)
},
0x81: func(sys *cpu) {
sys.add(sys.c)
}
}
func (sys *cpu) eval() {
return fnTable[opcode](sys)
}
1.哪个更好?
2.哪个更快?
also
3.我可以内联声明一个函数吗?
4.我有一个cpu
struct
其中我有寄存器等。如果我有寄存器并且全部作为全局变量,会更快吗? (没有struct
)
非常感谢。
我做了一些基准测试,一旦案例数量超过 4 个,表格版本就会比开关版本更快。
我惊讶地发现 Go 编译器(gc,无论如何;不确定 gccgo)似乎不够智能,无法将密集开关转换为跳转表。
Update:
Ken Thompson 在 Go 邮件列表上发布了描述优化交换机的难点 https://groups.google.com/d/msg/golang-nuts/IURR4Z2SY7M/R7ORD_yDix4J.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)