从性能的角度来看有什么问题?

时间:2016-01-29 06:49:33

标签: c

我刚写了一个简单的代码来以hh:mm:ss格式显示时间。代码是

#include <stdio.h>
#include <time.h>

int main()
{
  time_t curtime;
  int h, m, s, ps;
  struct tm *x = localtime(&curtime);

  time(&curtime);
  ps = (*x).tm_sec;
  while(1)
    {
      time(&curtime);
      x = localtime(&curtime);
      h = (*x).tm_hour;
      m = (*x).tm_min;
      s = (*x).tm_sec;
      if(s != ps)
        {
          ps = s;
          printf("%02d:%02d:%02d\n", h, m, s);
        }
    }
  return(0);
}

代码按预期编译并运行。然而,CPU使用率似乎非常高。当我使用&#39; top&#39;看到cpu使用情况,它显示cpu%为96-100%(我可以听到电脑风扇响亮)。如何从性能角度改进代码,保持代码简单和简短?

2 个答案:

答案 0 :(得分:5)

原因是你的循环几乎不包含任何等待的东西(唯一的是printf s,但我认为你重定向那个或printf由于其他原因很快完成) 。这意味着该程序始终有资格运行。

另一方面,在您的计算机上运行的所有其他程序经常会等待:用户输入,网络消息或其他任何内容。这意味着他们大部分时间都没有资格参加比赛。

操作系统的作用是因为您的程序有工作要做,但没有其他进程(目前)它会安排程序在大多数时间运行(96-100%)。因此它会占用那么多CPU。

这通常不是一件坏事。如果你的程序有工作要做,那么如果它是唯一的程序,应该有机会这样做。这不是关于性能 - 或者说是另一种方式,它是关于性能的,操作系统将为您的程序提供尽可能快地完成的机会(尽管它不知道在这种情况下它根本无法完成)。

通常对这些进程(即那些受CPU限制的进程)做的事情是降低其优先级。这看起来似乎违反直觉,但实际上它会告诉操作系统为该过程分配所有未用于其他任何事情的处理能力,这意味着只要其他程序必须处理鼠标点击就会有处理能力或键盘输入(这意味着您不会注意到CPU负载计算正在进行)。一些操作系统会尝试自动执行此操作(例如Linux将优先处理等待很多的进程)。

答案 1 :(得分:4)

一般来说,由于你有一个无限循环,你的程序将使用所有处理器能力尽快执行自己。大多数简单的c程序在几秒钟内终止,所以这不是问题。然而,你没有。

为了至少严重限制CPU使用率,您可以在循环的每次迭代后留下sleep()指令,以便系统有时间在其间执行其他操作。

以下是一个例子:

#include <stdio.h>
#include <unistd.h>

int main(void) {
    while(1) {
        printf("Aha");
        sleep(1);     // 1s sleep
        // Windows:
        // ::Sleep(500); // 500ms
    }
    return 0;
}