我正在用 JavaScript 模拟一个 8 位微处理器。我已将每个操作码函数名称存储在一个数组中,并调用与从我的虚拟内存读取的操作码相关的 256 个函数中的每一个,如下所示:
this.OP[opcode] = 'this.LDAA()';
eval(this.OP[opcode]);
我最近更改了我的代码以摆脱 eval() 如下:
this.OP[opcode] = 'LDAA';
this[this.OP[opcode]]();
在 Mac Safari 中,以上两者之间没有明显的速度差异,这让我感到惊讶。我认为后者会更快,但我的虚拟时钟速度对于两者来说大致相同(目前峰值为 4MHz)。
由于与使用 eval() 相比,使用索引方法调用似乎没有速度损失,我希望也更新我的虚拟内存系统,但我对要使用的语法有一个心理障碍。
要写一个字节,我有:
RAM = {
write : [],
setup : function() {
this.write[addr] = "this.simpleWrite(addr,byte)";
},
writeByte : function(addr,byte) {
eval(this.write[addr]);
},
simpleWrite : function(addr,byte) {
this.memory[addr] = byte;
},
};
RAM.writeByte( someAddress, someValue );
我正在使用这种索引的间接方法,因此我可以将设备映射到地址范围并根据需要放置断点和观察点,这些断点和观察点都会拦截内存读取和写入 - 最大限度地提高性能。
关于如何在保持数据吞吐量的同时丢失 eval 的任何建议?
我想将外部方法映射到间接数组中,并且能够传递参数(要写入的值)。因此,无论哪个虚拟硬件使用公共接口访问虚拟内存,其他虚拟硬件都可以拦截该进程并在必要时监视或更改值。