时钟速度公式

时间:2009-10-15 02:58:18

标签: c# vb.net algorithm performance formula

是否有一种简单的方法可以确定“睡眠”需要多少毫秒才能“模拟”2 mhz的速度。换句话说,我想执行一条指令,调用System.Threading.Thread.Sleep()函数一个X毫秒,以模拟2 mhz。这不需要精确到毫秒,但是我能得到一个球场吗?一些论坛将PC时钟速度除以2 mhz之类的东西?

由于

4 个答案:

答案 0 :(得分:1)

2 MHz时钟周期为500 ns。 Sleep的参数以毫秒为单位,因此即使您使用Sleep(1),也会错过2,000个周期。

更糟糕的是,Sleep并不承诺它会在X毫秒后返回,只会在至少 X毫秒后返回。

最好的办法是使用某种Timer来阻止程序过快消耗或生成数据。

答案 1 :(得分:1)

对于用户来说,小于100毫秒左右的暂停通常是难以察觉的。基于此,不是在每条指令之后尝试睡眠,而是在执行50 ms这样的事情,然后睡眠一段适当的时间,然后执行另外50 ms时,你会好得多。

然而,还要注意,大多数具有2 MHz时钟(例如Z80)的处理器实际上并不实际每秒执行200万条指令。 2 MHz Z80至少需要4个处理器时钟来获取一条指令,最大指令速率为500 KHz。

答案 2 :(得分:1)

请注意,休眠并不是在功能较弱的CPU上运行代码的良好代理。除了时钟速率之外,还有许多因素会影响计算性能。在许多情况下,时钟速率是计算性能的第二或第三(或第10)阶确定。

另请注意,高分辨率的QueryPerformanceCounter()在大多数系统上都很昂贵(在许多情况下为3000到5000个CPU时钟)。原因是它需要系统调用以及系统南桥中HPET的多次读取。 (注意,这因系统而异)。

您能帮我们更好地了解您的目标吗?

正如我在评论James Black的回答时提到的:不要轮询定时器调用(如QPC或直接X stufF)。你的线程将消耗大量的CPU周期,不会让任何线程处于较低优先级的运行,并且大部分时间都会占用优先级。请注意,NT Scheduler会调整线程优先级。这被称为'助推'。如果你的线程被提升并击中你的一个轮询循环,那么它几乎肯定会导致性能问题。从系统的角度来看,这是非常糟糕的行为。尽可能避免使用它。

另一种说法:Windows是一个多任务操作系统,用户可以运行很多东西。请注意,您的应用程序在更大的上下文中运行,其行为可能会对系统产生影响。

答案 3 :(得分:0)

你将遇到的问题是,Windows上的最小睡眠时间似乎大约是20-50毫秒,所以尽管你可能想要睡眠1毫秒,但由于其他进程会正在运行,时间片非常大。

如果你必须有一个很短的时间,比如500ns(1 / 2e06 * 1000)那么你会想要使用DirectX,因为它有一个高分辨率的计时器,所以你可以循环直到暂停完成,但是,您将需要接管计算机,不允许其他进程中断正在发生的事情。