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

C 从性能的角度看有什么问题?,c,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(&am

我刚刚编写了一个简单的代码,以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);
}
#包括
#包括
int main()
{
时间短了;
int h,m,s,ps;
struct tm*x=localtime(&curtime);
时间(&curtime);
ps=(*x).tm_秒;
而(1)
{
时间(&curtime);
x=本地时间(&curtime);
h=(*x).tm_小时;
m=(*x).tm_min;
s=(*x).tm_秒;
如果(s!=ps)
{
ps=s;
printf(“%02d:%02d:%02d\n”,h、m、s);
}
}
返回(0);
}

代码按预期编译和运行。然而,cpu的使用率似乎非常高。当我使用“top”来查看cpu使用情况时,它显示cpu%为96-100%(我可以听到计算机风扇的声音)。如何从性能角度改进代码,使代码保持简单和简短?

一般来说,由于您有一个无限循环,您的程序将使用所有处理器的能力尽可能快地执行自身。大多数简单的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;
}
#包括
#包括
内部主(空){
而(1){
printf(“Aha”);
睡眠(1);//1s睡眠
//窗口:
//::睡眠(500);//500毫秒
}
返回0;
}

一般来说,由于您有一个无限循环,您的程序将使用所有处理器的能力尽可能快地执行自身。大多数简单的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;
}
#包括
#包括
内部主(空){
而(1){
printf(“Aha”);
睡眠(1);//1s睡眠
//窗口:
//::睡眠(500);//500毫秒
}
返回0;
}

原因是您的循环几乎不包含任何要等待的内容(唯一的事情是
printf
s,但我假设您重定向了该循环,或者由于其他原因导致
printf
很快完成)。这意味着程序始终有资格运行

另一方面,在你的计算机上运行的所有其他程序通常都会等待一些东西:用户输入、网络消息或其他任何东西。这意味着他们大部分时间都没有资格运行

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

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


对于这类进程(即CPU受限的进程),人们经常做的一件事就是降低它们的优先级。起初,这似乎有悖常理,但实际上,它会告诉操作系统将所有不用于其他用途的处理能力分配给该进程,这意味着每当其他程序必须处理鼠标单击或键盘输入时,都会有可用的处理能力(这意味着您不会注意到有太多CPU密集的计算正在进行)。一些操作系统尝试自动执行此操作(例如,Linux将优先处理等待时间过长的进程)。

原因是您的循环几乎不包含任何要等待的内容(唯一的问题是
printf
s,但是我假设您重定向了它,或者由于其他原因,
printf
很快就完成了)。这意味着程序始终可以运行

另一方面,在您的计算机上运行的所有其他程序通常都会等待一些东西:用户输入、网络消息或其他任何东西。这意味着它们不能在大多数时间运行

操作系统所做的是因为你的程序有工作要做,但没有其他进程(目前)它会安排你的程序大部分时间(96-100%)运行。因此它会消耗那么多CPU

这通常不是一件坏事。如果你的程序有工作要做,如果它是唯一有工作要做的程序,那么应该给它这样做的机会。这不是真正的性能问题——或者换句话说,这是性能问题——操作系统将给你的程序一个尽快完成的机会(尽管它不知道在这种情况下它根本不会结束)


这类进程(即CPU受限的进程)通常要做的一件事首先,这可能看起来有悖常理,但实际上,它会告诉操作系统将所有不用于其他用途的处理能力分配给该进程,这意味着每当其他程序必须处理鼠标单击或键盘输入时,都会有可用的处理能力(这意味着你不会注意到有太多CPU密集的计算在进行)。一些操作系统尝试自动执行此操作(例如Linux会优先处理等待时间很长的进程)。

看看你遗漏了什么。现在,我看不到任何东西会使性能异常明显(除了那奇妙的无限循环)。你正在退出
while(1)
?while不是我所关注的。好吧,我可以添加一些条件,比如“if(ps==50)break”。这会使它成为更好的代码吗?这不是我所说的while循环。cpu使用率仍然很高。@anupamb你不能