限制模拟cpu速度的方法

时间:2011-07-03 03:13:50

标签: java optimization emulation

我正在编写一个MOS 6502处理器仿真器,作为我业余时间进行的大型项目的一部分。模拟器是用Java编写的,在你说之前,我知道它不会像用c或汇编语言那样高效和优化,但目标是使它在各种平台上运行并拉动2.5MHZ在1GHZ处理器上,这对于解释型仿真器非常有用。我的问题恰恰相反,我需要将周期数限制为1MHZ。我环顾四周,但没有看到很多这样做的策略。我尝试了一些事情,包括检查一些周期后的时间和睡眠预期时间与实际时间之间的差异,但检查时间会使仿真速度减慢8倍,所以有人有任何更好的建议或也许在Java中优化时间轮询以减少减速的方法?

4 个答案:

答案 0 :(得分:3)

使用sleep()的问题在于,您通常只能获得1ms的粒度,并且您将获得的实际睡眠不一定精确到最接近的1ms,因为它取决于系统的其余部分是什么这样做。尝试了几个建议(我的头脑 - 我实际上没有用Java编写CPU模拟器):

  • 坚持你的想法,但检查大量模拟指令之间的时间(执行将会有点“块状”,尤其是在单处理器机器上,因为操作系统可能会带走你的线程中的CPU一次只有几毫秒);

  • 由于您希望以每毫秒1000个模拟指令的顺序执行,您还可以尝试在“指令”之间挂起CPU:让您的程序通过反复试验来定期运行多少次运行它需要在指令之间进行循环,以“浪费”足够的CPU,使计时平均以100万次模拟指令/秒运行(您可能希望查看在这种情况下将线程设置为低优先级是否有助于系统性能)。

答案 1 :(得分:3)

您可能有兴趣检查Java Apple Computer Emulator (JACE),其中包含6502仿真。它在TimedDevice类中使用Thread.sleep()

答案 2 :(得分:1)

您是否考虑过创建一个以您需要的周期长度关闭的Timer对象?您可以让计时器本身启动下一个循环。

以下是Java 6版本的文档: http://download.oracle.com/javase/6/docs/api/java/util/Timer.html

答案 3 :(得分:1)

我会在忙碌的等待中使用System.nanoTime(),就像之前建议的@pst一样。

您可以通过生成字节代码来加速仿真。大多数指令应该很好地转换,你可以添加一个忙等待调用,这样每条指令都需要原始指令完成的时间。您可以选择增加延迟,以便查看正在执行的每条指令。

为了使它真的很酷,您可以生成6502汇编代码作为文本,在字节代码中匹配行号。这将允许您使用调试器逐步执行代码,断点并查看应用程序正在执行的操作。 ;)

模拟内存的一种简单方法是使用直接ByteBuffer或带有Unsafe类的本机内存来访问它。这将为您提供一个内存块,您可以按任何顺序访问任何数据类型。