我正在编写一个 MOS 6502 处理器仿真器,作为我在业余时间进行的一个更大项目的一部分。模拟器是用 Java 写的,在你说之前,我知道它不会像用 c 或汇编写的那样高效和优化,但目标是让它在各种平台上运行,并拉动 2.5MHZ在 1GHZ 处理器上,这对于解释型仿真器来说非常好。我的问题恰恰相反,我需要将周期数限制为 1MHZ。我环顾四周,但没有看到很多这样做的策略。我尝试了一些事情,包括在多个周期后检查时间,并根据预期时间和实际耗时之间的差异进行 hibernate ,但检查时间会使仿真速度减慢 8 倍,所以有没有人有更好的建议或也许是在 Java 中优化时间轮询以减少减速的方法?
最佳答案
使用 sleep() 的问题是您通常只能获得 1 毫秒的粒度,而您将获得的实际 sleep 甚至不一定精确到最接近的 1 毫秒,因为它取决于系统的其余部分是什么正在做。尝试一些建议(我突然想到——我实际上并没有用 Java 编写 CPU 模拟器):
坚持你的想法,但检查大量模拟指令之间的时间(无论如何执行都会有点“不稳定”,尤其是在单处理器机器上,因为操作系统可能会带走CPU 一次占用您的线程几毫秒);
因为您希望以每毫秒 1000 条模拟指令的顺序执行,您也可以尝试在“指令”之间卡在 CPU 上:让您的程序通过反复试验定期计算出运行了多少次它需要在指令之间进行循环以“浪费”足够的 CPU 以使计时平均达到 100 万条模拟指令/秒(在这种情况下,您可能想看看将线程设置为低优先级是否有助于提高系统性能)。
关于java - 限制模拟 CPU 速度的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6560887/