我正在努力解决Cult of the Bound Variable问题。
问题的一部分是你为“古代”通用机器实现了一个解释器。我已经为他们描述的机器实现了一个解释器,现在我正在运行一个大学提供的测试它的基准程序。
这个解释器的我的C#实现是慢!
我在ANTS探查器中启动了我的程序以查看减速的位置,我可以看到超过96%的时间被“加载程序”操作占用。
此运算符的specification如下:
#12. Load Program.
The array identified by the B register is duplicated
and the duplicate shall replace the '0' array,
regardless of size. The execution finger is placed
to indicate the platter of this array that is
described by the offset given in C, where the value
0 denotes the first platter, 1 the second, et
cetera.
The '0' array shall be the most sublime choice for
loading, and shall be handled with the utmost
velocity.
以下是此运算符的代码:
case 12: // Load Program
_platters[0] = (UInt32[])_platters[(int)_registers[B]].Clone();
_finger = _registers[C];
break;
我的整个“通用机器”解释器的源代码是here。
我可以做些什么来加快速度?这个解释器的其他实现用C语言编写,可以更快地完成整个基准测试。
答案 0 :(得分:7)
Buffer.BlockCopy
承诺要快得多。
答案 1 :(得分:6)
您可以尝试使用Buffer.BlockCopy
,但如果在这种情况下有任何重大差异,我会感到惊讶:
case 12: // Load Program
uint[] src = _platters[(int)_registers[B]];
_platters[0] = new uint[src.Length];
Buffer.BlockCopy(src, 0, _platters[0], 0, src.Length * 4);
_finger = _registers[C];
break;
答案 2 :(得分:4)
使用此处描述的BlockCopy方法:http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/42189513-2106-4467-af9a-3b1810509cc8/
答案 3 :(得分:0)
根据两个结果数组的使用方式,您可以使用copy-on-write的修改:
您不会直接使用数组,而是使用包装器。要克隆数组,只需创建另一个包装器。如果您尝试写入由多个包装器共享的数组,则执行实际克隆并将包装器分离。
答案 4 :(得分:0)
除了手头的问题,你的虚拟机基准测试如此糟糕的真正原因是你应该按照规范说的那样以“最大速度”处理0;)
基本上,通过从0到0加载来执行常规跳转。这在codex代码中非常常见。你应该完全避免克隆,只更新那个特定情况下的“手指”。