有没有一种简单的方法来确定我需要“睡眠”多少毫秒才能“模拟”2 mhz 的速度。换句话说,我想执行一条指令,调用 System.Threading.Thread.Sleep() 函数 X 毫秒,以模拟 2 mhz。这不需要精确到毫秒,但是我能得到一个球场吗?一些论坛将PC时钟速度除以2 mhz之类的?
谢谢
有没有一种简单的方法来确定我需要“睡眠”多少毫秒才能“模拟”2 mhz 的速度。换句话说,我想执行一条指令,调用 System.Threading.Thread.Sleep() 函数 X 毫秒,以模拟 2 mhz。这不需要精确到毫秒,但是我能得到一个球场吗?一些论坛将PC时钟速度除以2 mhz之类的?
谢谢
对于用户来说,小于 100 毫秒左右的停顿通常是难以察觉的。基于此,与其在每条指令之后尝试休眠,不如执行 50 毫秒之类的东西,然后休眠适当的时间长度,然后再执行 50 毫秒,这会更好。
然而,还要注意,大多数具有 2 MHz 时钟的处理器(例如 Z80)实际上并没有每秒执行 200 万条指令。2 MHz Z80 至少需要四个处理器时钟来获取一条指令,最大指令速率为 500 KHz。
2 MHz 时钟的周期为 500 ns。Sleep 的参数以毫秒为单位,因此即使您使用 Sleep(1),也会错过 2,000 个周期。
更糟糕的是,Sleep 并没有保证它会在 X 毫秒后返回,只是它会在至少X 毫秒后返回。
您最好的选择是使用某种 Timer 来阻止程序过快地消耗或生成数据的事件。
请注意,睡眠根本不是在功能较弱的 CPU 上运行代码的良好代理。除了时钟频率之外,还有很多因素会影响计算性能。在许多情况下,时钟速率是计算性能的二阶或三阶(或十阶)决定因素。
另请注意,QueryPerformanceCounter() 虽然高分辨率在大多数系统上是昂贵的(在许多情况下为 3000 到 5000 个 CPU 时钟)。原因是它需要系统调用和从系统南桥中的 HPET 进行多次读取。(注意,这因系统而异)。
你能帮助我们更好地理解你想要做什么吗?
正如我在评论詹姆斯布莱克的回答中提到的那样:不要轮询计时器调用(如 QPC 或直接 X stufF)。您的线程将简单地消耗大量 CPU 周期,并且不会让任何处于较低优先级的线程运行,并且大部分时间都会在其优先级上耗尽。请注意,NT 调度程序确实会调整线程优先级。这被称为“提升”。如果您的线程被提升并命中您的轮询循环之一,那么它几乎肯定会导致性能问题。从系统的角度来看,这是非常糟糕的行为。尽可能避免它。
换一种说法:Windows 是一个多任务操作系统,用户运行很多东西。请注意,您的应用程序在更大的上下文中运行,其行为可能会产生系统范围的影响。
您将遇到的问题是 Windows 上的最短睡眠时间似乎约为 20-50 毫秒,因此尽管您可能会说您想睡眠 1 毫秒,但由于其他进程将运行,它会稍后醒来,而且时间片相当大。
如果你必须有一个小的时间,比如 500ns (1/2e06 * 1000),那么你会想要使用 DirectX,因为它有一个高分辨率的计时器,所以你可以循环直到暂停完成,但是,你会需要接管计算机,不允许其他进程中断正在发生的事情。