在程序中实施人为延迟是一种好习惯吗?

时间:2013-08-09 10:51:39

标签: language-agnostic while-loop delay

我注意到,每次程序依赖while循环来保持打开时,它几乎占用了100%的CPU。添加20ms的延迟会使该数字降至0%。

以下代码将最大化CPU:

while(executing){
    // Do some things
    if(Quit) executing = 0;
}

但接下来不会:

while(executing){
    // Do some things        
    if(Quit) executing = 0;
    delayFunction(20); //20ms delay
}

这是正确的方法吗?如果是这样,什么会被认为是适当的延迟?

有没有更好的方法可以避免CPU过载?

5 个答案:

答案 0 :(得分:1)

操作系统级别的sheduler负责管理CPU资源和跨进程的时间。

没有延迟,计算机会尽可能快地运行循环,因此它使用了可用于此过程的所有资源。

延迟时间,你告诉牧人他有X毫秒做其他事情。如果没有其他进程需要处理时间,则CPU不会对此延迟执行任何操作。

这是一个很大的问题,这是一个功能。并没有更好的办法。所有的魔法都在等待的毫秒数。但这取决于很多因素,因此无法具体说明这一点。

答案 1 :(得分:1)

Performance analyst's number one answer is, "It depends." 有很多因素需要考虑,有些因素使自愿yield()delay()看起来很好,有些则让它们看起来很糟糕。

  • 我们在谈论什么样的机器和任务? (使用收音机的循环会导致手机变热。)
  • 手头的任务有多重要? (心脏监护仪必须按时捕获和显示样本。)
  • 机器还在做什么? (VM主机运行大量客户机,CPU循环使其他进程匮乏。)
  • 监管代码是否会抢占任务? (大多数操作系统会让更高优先级的任务在中间循环中接管。)

答案 2 :(得分:0)

这两种“延迟技术”之间的概念不同。首先,你所做的只是旋转CPU,你的程序实际上在那些时刻在CPU上运行并消耗大量资源。

另一方面,在第二种情况下,您可以想象您的程序被搁置了20ms,并且CPU可以在此期间执行其他操作(或者只是保持空闲状态)。在后台发生的事情或多或少是sleep system call

一般来说,你会想要采用第二种方法,因为它消耗的CPU要少得多。

答案 3 :(得分:0)

延迟可以实现的是程序执行的时间更长。 操作系统负责进程之间的CPU共享。 只要您不将流程优先级更改为实时,并将线程优先级更改为最高,您就不必担心延迟

答案 4 :(得分:0)

插入故意延迟有多种可能的原因。我曾经在填充一个非常大的数据库的早期阶段工作过。虽然它仍然很小,但响应速度很快,但随着越来越多的数据被添加到数据库中,显然预计会变慢。为了保持用户期望的真实性,我们在开始时设置了最小响应时间,这样用户就不会看到响应速度变慢。在不到0.5秒的时间内返回的任何内容一直持续到最小时间结束,然后才发送给用户。