C# 时钟速度公式

C# 时钟速度公式,c#,vb.net,algorithm,performance,formula,C#,Vb.net,Algorithm,Performance,Formula,有没有一种简单的方法来确定我需要“睡眠”多少毫秒才能“模拟”2MHz的速度。换句话说,我想执行一条指令,调用System.Threading.Thread.Sleep()函数,执行时间为X毫秒,以模拟2MHz。这不需要精确到毫秒,但我能找到一个棒球场吗?一些将PC时钟速度除以2MHz或其他频率的例子 谢谢,2 MHz时钟的周期为500 ns。Sleep的参数以毫秒为单位,所以即使使用Sleep(1),也会错过2000个周期 更糟糕的是,睡眠不能保证它会在X毫秒后返回,而只能保证它会在至少X毫秒后

有没有一种简单的方法来确定我需要“睡眠”多少毫秒才能“模拟”2MHz的速度。换句话说,我想执行一条指令,调用System.Threading.Thread.Sleep()函数,执行时间为X毫秒,以模拟2MHz。这不需要精确到毫秒,但我能找到一个棒球场吗?一些将PC时钟速度除以2MHz或其他频率的例子


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

更糟糕的是,睡眠不能保证它会在X毫秒后返回,而只能保证它会在至少X毫秒后返回


最好的办法是在事件中使用某种计时器,以防止程序过快地消耗或生成数据。

您将遇到的问题是,windows上的最小睡眠时间似乎在20-50毫秒左右,因此,尽管您可能会将您想要的睡眠时间设置为1毫秒,但它会在稍后醒来,由于其他进程将运行,并且时间片相当大


如果你必须有一个小的时间,比如500ns(1/2e06*1000),那么你需要使用DirectX,因为它有一个高分辨率的计时器,这样你就可以循环直到暂停完成,但是,你需要接管计算机,不允许其他进程中断正在进行的操作。

对于用户,通常,不到100毫秒左右的停顿是难以察觉的。基于此,与其在每条指令后尝试休眠,不如先执行50毫秒,然后休眠适当的时间,然后再执行50毫秒


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

请注意,睡眠根本不是在性能较差的CPU上运行代码的好代理。除了时钟速率之外,还有许多因素会影响计算性能。在许多情况下,时钟频率是计算性能的二阶或三阶(或十阶)决定因素

还要注意的是,QueryPerformanceCounter()虽然在大多数系统上分辨率很高,但成本很高(在许多情况下是3000到5000个CPU时钟)。原因是它需要一个系统调用和从系统南桥中的HPET进行多次读取。(注意,这因系统而异)

你能帮我们更好地了解你想做什么吗

正如我在评论詹姆斯·布莱克的答案时所提到的:不要轮询计时器调用(如QPC或direct X之类)。你的线程只会消耗大量的CPU周期,而不会让任何优先级较低的线程运行,并且会占用其优先级的大部分时间。请注意,NT调度程序确实会调整线程优先级。这就是所谓的“提升”。如果您的线程被提升并命中其中一个轮询循环,那么它几乎肯定会导致性能问题。从系统的角度来看,这是非常糟糕的行为。尽可能避免


换句话说:Windows是一个多任务操作系统,用户可以运行很多东西。请注意,您的应用程序正在更大的环境中运行,其行为可能会对整个系统产生影响。

DirectX不是获得高分辨率计时器的唯一方法。您也可以使用QueryPerformanceCounter。事实上,您可以使用System.Diagnostics.Stopwatch,它在内部包装QueryPerformanceCounter。@Robert-我从来没有使用过它,我只想在DirectX中使用它,但是,谢谢您的评论,我将查看QueryPerformanceCounter。我只是想给他一个建议去做他想做的事,因为线程。睡眠不能做到。这是不对的。最小睡眠时间可以是1ms(甚至更短)。这取决于计时器滴答声中断的运行速度。这在运行时可能会有所不同。有关timeBeginPeriod(),请参阅文档。还要注意,sleeping()与轮询和循环非常不同。睡眠阻塞,线程在睡眠时不会使用CPU周期。轮询是CPU周期的巨大消耗。轮询在许多应用程序中都是一个典型的性能设计和实现问题-尽可能避免这种情况。@Foredecker-根据我的经验,您可以告诉它睡眠1ms,但每个线程都有一个最短的时间片,因此它从您的线程经过的时间,为另一个线程做一些事情,然后唤醒你的线程不会是1ms。睡眠时间是指不早于这个时间叫醒我,而不是在这个时间之后。如果你的应用程序是唯一一个运行的,那么轮询就没什么大不了的,如果你需要在这么短的时间间隔内做些什么,那么轮询可能是有用的。当我这样做的时候,它是在游戏中,所以我会做其他的动作(检查输入,基本内务),然后检查时差,然后如果是时间开始/停止音乐(我需要这个功能),或者在关闭计算机之前更新倒计时。当然,有时,只有一件看起来像应用程序的东西在运行。但很少有应用程序是系统上运行的唯一对用户重要的东西。最重要的是,一个应用程序不知道运行的是什么-编写一个应用程序来进行民意调查有时是不实际的,而不是其他。。。。它怎么知道什么时候不投票?如果有可能编写一些代码来避免轮询,那就是最好的方法。请允许我澄清我所说的“生产或消费”是什么意思。假设您正在生成要显示在屏幕上的图像,例如视频游戏。如果生成图像的速度太快,游戏会感觉运行得非常快。你需要弄清楚你的数据是什么,如果你生产或消费,以及多久一次。然后使用System.Timer调用生产者/消费者函数。QueryPerformanceCounter不正确,因为您